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)
表达式语句具有表单
Run Code Online (Sandbox Code Playgroud)expression-statement: expression_opt ;表达式是一个废弃值表达式(第8条)......
但是,这是否足够S::x不被使用?6.2,第3段[basic.def.odr]指出
一种可变
x为潜在评估表达式出现的名字ex被ODR使用的由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不是用的?
| 归档时间: |
|
| 查看次数: |
1681 次 |
| 最近记录: |