当我尝试编译时
template<int dim>
struct Foo
{
Foo(const int (&i)[dim]) {}
};
int main()
{
Foo<2> f = Foo<2>((int[2]){0}); // line 9
return 0;
}
编译错误
test.cpp:9:31: error: no matching function for call to ‘Foo<2>::Foo(int [1])’
显然,我传递给构造函数的参数被视为 int[1]
。为什么它不被视为 int[2]
(然后可以按照构造函数的预期将其转换为 const 引用)?缺失的元素不应该按照8.5.1(7)进行值初始化吗?
毕竟,将第 9 行替换为
int arg[2] = {0};
Foo<2> f = Foo<2>(arg);
让我编译程序。此外,当我尝试将 (const int [2]){0, 0, 0}
传递给构造函数时,我收到错误消息 too many initializers for 'const int [2] ',很明显,编译器正在尝试构造一个const int[2]
。
请有人阐明这种不符合直觉的行为。
最佳答案
构造 (int[2]){0}
是一个 C99 复合文字,它不是 C++ 的一部分。特定的编译器如何在 C++ 的上下文中解释是任何人的猜测(或者检查源代码的问题)。
附言。好的,看起来 gcc 4.7/gcc 4.8/clang-3.1 处理得相当明智——复合文字的类型与 C99 标准指定的类型相同。
我想 OP 编译器有点旧。
关于c++ - 将缺少初始值设定项的数组作为参数传递时编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13765892/