【问题标题】:Is it a defect in basic.def.odr section这是 basic.def.odr 部分的缺陷吗
【发布时间】:2020-06-23 09:29:48
【问题描述】:
struct S { static const int x = 0; };
int main(){
  S obj;
  int v = obj.x;
}

考虑上面的代码,obj.x 是 odr-use 吗?根据basic.def.odr#3的部分看

名称显示为潜在求值表达式 ex 的变量 x 被 ex odr 使用,除非对 x 应用左值到右值转换会产生 常量表达式 不调用任何非平凡函数,如果 x 是一个对象,ex 是表达式 e 的潜在结果集合中的一个元素,其中左值到右值的转换是应用于 e,或者 e 是弃值表达式。

我们有如下分析:

在我的代码中,变量名是x,也就是上面引用中的x,表达式obj.x就是引用中的ex。那么,obj.x 是一个可能被评估的表达式吗?是的,正是因为这样:

一个表达式可能会被计算,除非它是一个未计算的操作数或其子表达式。

obj.x 既不是未计算的操作数,也不是其子表达式。所以obj.x 是一个潜在的评估表达式。并且应用左值到右值x 确实会产生一个常量表达式,因为它是由0 初始化的。我怀疑的是以下,即,

并且,如果 x 是一个对象,则 ex 是表达式 e

潜在结果集合中的一个元素

我们假设 e 是 obj.x 因为左值到右值的转换将适用于它。 e 的潜在结果是什么?如下:
basic.def.odr#2

表达式 e 的潜在结果集定义如下:

  • 如果 e 是类成员访问表达式,则该集合包含对象表达式的潜在结果。

因为 e 是一个类成员访问表达式。因此它的一组潜在结果是对象表达。

expr.ref#3

将postfix-expression.id-expression缩写为E1.E2,E1称为对象表达式。

所以,这里的对象表达式是obj,因此表达式obj.x 的潜在结果集包含obj。显然,这里的 ex 是 xand if e isobj.xthen its set of potential results of expression would beobj. So, what the expression eof which the exx` 是一组潜在结果的元素吗?根据basic.def.odr#2看,我什么也没找到。

我只是很确定左值到右值的转换应用于obj.x 整个表达式。但是,所有compiler 都同意obj.x 的使用不是odr-use。是不是标准的缺陷?

【问题讨论】:

标签: c++ c++17 language-lawyer


【解决方案1】:

你不能依赖编译器来告诉你它是否是一个 odr-use;如果是,并且您尚未定义变量,则程序格式错误,无需诊断。也就是说,这似乎是 C++17 中的一个缺陷,因为忽略了使用类成员访问(而不是 qualified-id)引用静态成员变量的可能性。

【讨论】:

  • 是的,这是一个缺陷,因为措辞已被修改,见basic.def.odr#2.4,然而,它仍然是一个关于'S::x'的缺陷,因为对于这样的e的一组潜在结果情况不清楚。
  • 也就是说,这似乎是C++17中的一个缺陷 即CWG2353。
  • @jackX:我不确定我是否看到了剩余的缺陷:看起来很奇怪,类成员访问的 id-expression 被认为是一个操作数(参见[expr.prim.id.dtor]/2; 没有正式定义),因此是一个子表达式,由潜在结果规则单独考虑。
  • @DavisHerring IIUC 这里担心的是qualified-id S::x 不是name,当[basic.def.odr]/4 说A variable x whose name appears as a potentially-evaluated expression E 时(也许s/as/in/ 会解决这个问题) .
  • @LanguageLawyer:“名字”这个词的含义很不幸,但我认为在使用 odr 的情况下仔细检查它并不是很有成效。 P1787 将与其他所有问题一起解决此问题。
猜你喜欢
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多