我只是不了解712博士



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::aS::b。这 原因是,根据5.16 [Expr.Cond]第4段 该条件表达的结果是lvalue,而 将LVALUE转换为此,而不是直接 对象,因此,这将使"立即应用"要求失败。这是 令人惊讶和不幸的是,因为只有价值观,而不是 使用静态数据成员的地址。(也这个问题 适用于提议的第696条的决议。)

好吧,如果"立即应用要求失败,则条件表达式中的表达式S::aS::b未使用的(ODR-used),因此,struct S的各个静态成员will will 不是需要在命名空间范围中定义。但这与DR所说的相反。我缺少什么?

我认为您缺少used的点:

it is used UNLESS ( (const) AND (immediately applied) )

so,如果"立即应用"是错误的,则除非是错误的,因此使用。

除非[...]

好吧,S::aS::b出现在f中的潜在评估表达中。

因此,除非适用以下任何例外。

[...]这是一个满足恒定表达式(5.20 [expr.const])要求的对象,并且立即应用了lvalue-to-rvalue转换(4.1 [cons.lval])。

好吧,这是一个满足在恒定表达式中出现的需求的对象。因此,它通过了测试。

但未立即应用LVALUE到RVALUE转换。

因此,测试失败。

由于整个部分都在"除非"下,但失败意味着上一个案件适用;该对象被视为"使用"。

相关内容

  • 没有找到相关文章

最新更新