根据 [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?
在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。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么这个程序的结果是3 "born"?和 4 死
- 为什么在递归中使用循环会产生意想不到的结果?
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么这两段使用 constexpr、__PRETTY_FUNCTION__ 和 char * 的代码有不同的结果?
- C++向量与 C# 列表.为什么它们会产生不同的结果?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 为什么函数 tellg() 没有返回好的结果?
- 双摆返回楠结果.为什么?
- 相机校准结果:为什么与输入相似
- 按回车键后,程序没有输出任何结果.为什么会这样
- 两个明显相似的函数给出了不同的结果.为什么
- 顺序和并行版本给出不同的结果 - 为什么
- 按位运算的意外结果 为什么 (1 | 1 & 2) 给出 1 而不是 2?