c++ - 将缺少初始值设定项的数组作为参数传递时编译失败

标签 c++ c++03

当我尝试编译时

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/

相关文章:

c++ - 如何使自定义容器类型适应 BOOST_FOREACH?

c++ - 为什么 ofstream 不以二进制方式在 linux 上写 utf16?

c++ - 如何使用 visual studio 2015 在 Windows 7 中构建最新的 tesseract 3.04

c++ - 在 C++ 的构造函数调用中通过命名参数分配类变量

c++ - `std::find()`是否短路?

c++ - 'TypeInfo<char>(char * )' isn' t defined but worked pre-C++11; what changed, and how can I fix the error?

c++ - 模板重载解决问题

c++ - 从对象 vector 返回特定类的对象

c++ - 如何通过用户给出的完整路径打开文件?

c++ - 我开发的wxWidgets程序在进程管理器中有两个入口。这是正常现象还是错误?