在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::a
被A::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。