在SO中的this answer中,OP说:
根据basic.def.odr/2,A::a[0]
的潜在结果集是empty,所以A::a
被这个表达式odr使用。
难道A::a[0]
不满足[basic.def.odr]/2中的第二个要点吗?如果是这种情况,那么A::a
不就是A::a[0]
的潜在结果吗?
然后,我们可以得出结论,A::a
在初始化int a = A::a[0];
时没有被A::a[0]
* odr使用 *,通过[basic.def.odr]/3,这与OP在他的回答中所说的完全相反。
我错过了什么?
编辑当我在上面提到[basic.def.odr]/2中的第二个要点时,我指的是草案N4618。该要点在OP所指的草案N3936中不存在。因此在我看来,根据N3936,A::a
是A::a[0]
的odr-使用,但不是N4618。我说的对吗?
1条答案
按热度按时间mrzz3bfm1#
起草“潜在结果”列表的人可能只是忘记了包括你所指的那个。Core issue 1926被提交,并且这个问题在C++17中被修复;
int a = A::a[0];
没有odr-使用A::a
(假设数组元素类型是int
)。分辨率是Dred,所以你可以认为它是追溯的。显然,在早期的草案中,它从来没有打算让这个odr-使用A::a
(假设元素类型是int
)。另外,还发现了该措辞的另一个问题,即它依赖于在odr使用有问题的对象(在本例中为数组
A::a
)上执行左值到右值转换的想法,但不能在数组glvalue上执行左值到右值转换。这是CWG2170,它也被接受为DR。