DR 712负责C 11中[basic.def.odr]/2的措词的更改,今天在[basic.def.odr]中对当前措辞进行了更改。2和3。但是,如DR所述,我仍在尝试理解变化的原因,如下所示:
712。有条件表达的整数恒定操作数是否已使用?
在描述了班级初始化的静态数据成员时 定义,9.2.3.2 [class.static.data]第3段说,
如果使用该成员,则仍应在命名空间范围中定义 在程序中...
"二手"的定义在3.2 [basic.def.odr]第1段:
中     名称显示为潜在评估
除非它是满足出现在A中的要求      stand表达式(5.20 [expr.const])和lvalue-to-rvalue conversion(4.1 [cons.lval])
立即应用   nbsp; nbsp;  现在考虑以下示例:
struct S { static const int a = 1; static const int b = 2; }; int f(bool x) { return x ? S::a : S::b; }
根据标准的当前措辞,此示例 要求在命名空间范围中定义
S::a
和S::b
。这 原因是,根据5.16 [Expr.Cond]第4段 该条件表达的结果是lvalue,而 将LVALUE转换为此,而不是直接 对象,因此,这将使"立即应用"要求失败。这是 令人惊讶和不幸的是,因为只有价值观,而不是 使用静态数据成员的地址。(也这个问题 适用于提议的第696条的决议。)
好吧,如果"立即应用要求失败,则条件表达式中的表达式S::a
和S::b
是未使用的(ODR-used),因此,struct S
的各个静态成员will will 不是需要在命名空间范围中定义。但这与DR所说的相反。我缺少什么?
我认为您缺少used
的点:
it is used UNLESS ( (const) AND (immediately applied) )
so,如果"立即应用"是错误的,则除非是错误的,因此使用。
除非[...]
好吧,S::a
和S::b
出现在f
中的潜在评估表达中。
因此,除非适用以下任何例外。
[...]这是一个满足恒定表达式(5.20 [expr.const])要求的对象,并且立即应用了lvalue-to-rvalue转换(4.1 [cons.lval])。
好吧,这是一个满足在恒定表达式中出现的需求的对象。因此,它通过了测试。
但未立即应用LVALUE到RVALUE转换。
因此,测试失败。
由于整个部分都在"除非"下,但失败意味着上一个案件适用;该对象被视为"使用"。