在 N4296, 3.2 [basic.def.odr]p3 中:
x
名称显示为潜在求值表达式的变量ex
被 odr 使用,ex
除非应用左值到右值转换来x
生成不调用任何非平凡函数的常量表达式,并且如果x
是对象,ex
则它是表达式 的潜在结果集e
,其中应用了左值到右值的转换e
,或者e
是丢弃值表达式。
这一段怎么解释?我找到了两个解释。
1 从这里“试图理解 C++14 (N4140) 中的 [basic.def.odr]/2 ”
让我们把它分成几个步骤:在表达式 `ex` 中出现变量 `x` 构成了 odr-use,除非:
- 要么
ex
没有潜在的评估,要么- 必须满足以下所有条件:
- “应用左值到右值的转换来
x
产生一个不调用任何非平凡函数的常量表达式” 和- “
ex
是表达式的潜在结果集合中的一个元素e
” ,并且以下任一项成立:
- “要么左值到右值的转换应用于
e
”- " or
e
是一个弃值表达式"
和 2 来自 cppreference http://en.cppreference.com/w/cpp/language/definition
除非以下任何一项为真,否则
x
潜在求值表达式中的变量ex
是 odr-used :
应用左值到右值的转换来
x
产生一个不调用非平凡函数的常量表达式
x
是一个对象,而 ex 是较大表达式的潜在结果之一e
,其中较大的表达式要么是丢弃值表达式,要么是左值到右值的转换
关于两个规则的第一个答案是and,另一个是any。哪一个是对的?
请将规则拆分为步骤来解释此代码:
struct S { static const int x = 0; };
extern S s;// no definition of s
int i = s.x;// is s odr-used? is x odr-used?
// gcc 5.1.0 is ok