【发布时间】:2012-11-25 19:07:37
【问题描述】:
当我尝试编译时
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::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]。
请有人解释一下这种不直观的行为。
【问题讨论】:
-
显然不是。如果它在哪里,它将编译。我正在寻找它不是 C++03 的原因。
-
使用
g++ (GCC) 4.7.0没有-std=c++0x编译良好span> -
它在带有
-std=c++03、-std=c++03和没有任何-sdt的g++ 4.6.3 上失败。