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

dced5bon  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(116)

在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::aA::a[0]的odr-使用,但不是N4618。我说的对吗?

mrzz3bfm

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。

相关问题