odr-use如何应用于由qualified-id标识的变量?

时间:2017-11-06 04:52:22

标签: c++ language-lawyer one-definition-rule

示例代码:

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的变量exx使用,除非将左值到右值的转换应用于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是嵌套名称说明符,后跟标识符,或其他一些与此无关的内容)。

我也不明白为什么在这句话中使用了两个不同的占位符exx。说" A出现为B"对我说,A和B在词汇上是相同的,但在B的背景下看到A有一些额外的含义。起初我认为这可能意味着S::a是一种更抽象的方式来讨论变量(例如,意味着由ex标识的变量)和x是表示该变量的表达式。然而引用继续说"将左值到右值的转换应用于x"因此x实际上是一个表达式;所以我不知道exe之间的区别。

此外,我不确定"表达式ex"完全是指。我想这是一个存在主义,它接管了程序中的所有表达式,e是{{1}}的子表达式。

0 个答案:

没有答案