根据 [basic.def.odr]/2,'A::a[0]' 的潜在结果集为空.为什么它是空的?

The set of potential results of `A::a[0]` is empty according to [basic.def.odr]/2. Why is it empty?

本文关键字:结果 为什么 basic odr def 根据      更新时间:2023-10-16

在SO的这个答案中,OP说:

根据 basic.def.odr/2,A::a[0]的潜在结果集为为空,因此此表达式使用 ODRA::a

A::a[0]不满足 [basic.def.odr]/2 中的第二个要点吗?如果是这样的话,A::a不是A::a[0]的潜在结果吗?

然后,我们会得出结论,A::a不是A::a[0]在初始化int a = A::a[0];中使用odr,由 [basic.def.odr]/3 使用,这与 OP 在他的回答中所说的完全相反。

我错过了什么?

编辑当我在 [basic.def.odr]/2 中提到第二个要点时,我指的是 N4618 草案。OP提到的N3936草案中没有这一要点。所以在我看来,根据 N3936A::aA::a[0]使用 ,但不是 N4618。我说的对吗?

起草"潜在结果"列表的人可能只是忘记包括您所指的那个。核心问题 1926 已提交,该问题于 C++17 中修复;int a = A::a[0];不会使用A::a(假设数组元素类型为int)。该决议是 DRed 的,因此您可以将其视为追溯。显然,它从未打算在早期草案中A::a这种 odr 使用(假设元素类型为int)。

另外,在措辞中发现了另一个问题,即它依赖于对 odr 使用有问题的对象执行左值到右值转换的想法(在本例中数组A::a),但你不能对数组 glvalue 进行左值到右值的转换。这是CWG2170,它也被接受为DR。

相关文章: