【发布时间】:2018-06-05 17:28:50
【问题描述】:
考虑这个来自cppreference的例子:
struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
我同意 &S::x 是一个丢弃值表达式,因为标准说(9.2,第 1 段 [stmt.expr] from n4700)
表达式语句的格式为
expression-statement: expression_opt ;表达式是丢弃值表达式(第 8 条)...
但是,这足以让S::x 不被odr 使用吗? 6.2,第 3 段 [basic.def.odr] 状态
变量
x的名称显示为潜在评估表达式ex被ex使用,除非
- ...
- 如果
x是一个对象,ex是表达式e的潜在结果集合中的一个元素,其中任一
- 左值到右值的转换 (7.1) 应用于
e,或e是弃值表达式(第 8 条)。
问题是丢弃值表达式&S::x没有潜在结果(这意味着S::x不是&S::x的潜在结果),从6.2第2段[basic.def .odr]:
...表达式
e的潜在结果集定义如下:
- 如果
e是 id 表达式 (8.1.4),则该集合仅包含e。- 如果
e是带有数组操作数的下标操作 (8.2.1),则该集合包含该操作数的潜在结果。- ...
- 否则集合为空。
那么,你怎么解释S::x 不是 odr-used?
【问题讨论】:
-
标准措辞的另一个问题是
S::x不是 name 。这是一个合格的ID。但显然“一个变量 x 的名字......”这句话也应该适用于x是一个合格的 id。 -
是的,这是我们这边的一个错误。固定。
-
@M.M 是这样的吗? github.com/cplusplus/draft/pull/1996
-
@T.C.制作废弃值表达式
&S::xodr-usex的合理性是什么? -
@xskxzr 获取某物的地址通常需要所说的东西存在。为这种情况划出一个例外有什么好处?
标签: c++ language-lawyer c++17