为什么S :: x没有使用?

b1s*_*sub 51 c++ language-lawyer c++17

cppreference考虑这个例子:

struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
Run Code Online (Sandbox Code Playgroud)

我同意这&S::x是一个废弃值表达式,因为标准说(9.2,第1段[stmt.expr]来自n4700)

表达式语句具有表单

expression-statement:
    expression_opt ;
Run Code Online (Sandbox Code Playgroud)

表达式是一个废弃值表达式(第8条)......

但是,这是否足够S::x不被使用?6.2,第3段[basic.def.odr]指出

一种可变x为潜在评估表达式出现的名字exODR使用的ex除非

  • ...
  • if x是一个对象,ex是表达式的潜在结果集的一个元素e,其中任何一个
    • 左值到左值的转换(7.1)适用于e
    • e是丢弃值表达式(第8条).

问题是丢弃值表达式&S::x没有潜在的结果(这意味着它S::x不是潜在的结果&S::x),如6.2,第2段[basic.def.odr]所示:

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

  • 如果e是id-expression(8.1.4),则该集仅包含e.
  • 如果e是带有数组操作数的下标操作(8.2.1),则该组包含该操作数的潜在结果.
  • ...
  • 否则,该集合为空.

然后,你怎么能解释这S::x不是用的?

T.C*_*.C. 5

它确实是很少使用的。你的分析是正确的(我固定的例如前一阵子)。

  • 我并不想写一个答案来确认我在评论中写的内容,但是由于某种原因,这个问题吸引了很多错误的答案:| (2认同)