【发布时间】: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 是一个类成员访问表达式。因此它的一组潜在结果是对象表达。
将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。是不是标准的缺陷?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ c++17 language-lawyer