【发布时间】:2019-04-05 22:26:32
【问题描述】:
以下代码在 Clang 中编译良好,输出大小为 int [3] 数组
#include <iostream>
int main()
{
const int (&a)[] = { 1, 2, 3 };
std::cout << sizeof a << std::endl;
}
然而,在 GCC 中,声明编译得很好,但 sizeof a 没有:显然 GCC 拒绝“推断”数组大小并最终以 a 作为对 const int [] 类型的引用,这是不完整的。
这种初始化的预期行为是什么?
9.3.4/3 似乎是此类情况下标准的相关部分,但它本身似乎并不能最终回答这个问题。
【问题讨论】:
-
const int (&a)[] = ...是否有效?标准规定了可以省略边界的情况 (eel.is/c++draft/dcl.array#3),但这仅适用于数组本身,不适用于对数组的引用。 -
@Daniel Langr:链接中的文字说:“除了允许不完整对象类型的声明,还可以省略数组绑定......” .这实际上恰好是一个允许不完整类型的声明:在 C++ 中对不完整类型的引用是可以的。从一开始,C++ 中就存在未知边界的数组作为不完整类型。尽管在这种情况下它是否应该保持不完整,但我并不清楚。因此问题。
-
@AnT:它说:
。所以它不允许引用类型(不过我不确定这是有意的)。 -
@geza:嗯...不。您引用的措辞是指上述“附加”案例,即在我上面引用的部分之后描述的那些。它与上述“允许不完整对象类型的声明”没有任何关系或关联,也不以任何方式禁止它们。那里的措辞非常清楚。
-
@AnT:我可能误解了你,或者标准。这是完整的句子:。这里不就是这样吗?界限是根据初始化程序计算的。 “允许的不完整类型”不是指“extern Foo a[];”这样的情况吗? (这里的 Foo 可能不完整)?在您的情况下,声明的类型必须是完整的,因为它是一个定义(据我了解,对不完整类型的引用是完整的类型)。
标签: c++ arrays reference list-initialization