示例代码:
struct S
{
static const int a = 0;
};
int const *b = &S::a;
我对ODR意图的理解是S::a
应该 odr-used ,因为它的地址是。
我的问题是:在此代码中,标准在何处以及如何指定S::a
odr-used ?
到目前为止我的研究: C ++ 14标准中唯一相关的部分似乎是[basic.def.odr] / 3:
x
的名称显示为可能评估的表达式ex
的变量ex
由x
使用,除非将左值到右值的转换应用于x
一个不调用任何非平凡函数的常量表达式,如果ex
是一个对象,e
是表达式e
的潜在结果集的一个元素,其中左值到右值的转换应用于e
,或S::a
是丢弃值表达式。
但是,我不知道x
如何适应这一点。 name ([basic] / 4)的定义不包括qualified-id,因此S::a
无法在此处引用x
。我没有看到标准中支持使用 name 的任何其他文本表示除[basic] / 4中的定义之外的任何内容。
也许a
表示a
;但是a
永远不会作为表达式出现,更不用说可能被评估的表达式:S::a
中的x
是标识符,而不是表达式。 (qualified-id是嵌套名称说明符,后跟标识符,或其他一些与此无关的内容)。
我也不明白为什么在这句话中使用了两个不同的占位符ex
和x
。说" A出现为B"对我说,A和B在词汇上是相同的,但在B的背景下看到A有一些额外的含义。起初我认为这可能意味着S::a
是一种更抽象的方式来讨论变量(例如,意味着由ex
标识的变量)和x
是表示该变量的表达式。然而引用继续说"将左值到右值的转换应用于x
"因此x
实际上是一个表达式;所以我不知道ex
和e
之间的区别。
此外,我不确定"表达式ex
"完全是指。我想这是一个存在主义,它接管了程序中的所有表达式,e
是{{1}}的子表达式。