【问题标题】:Compilation fails when passing array with missing initializers as argument传递缺少初始化程序的数组作为参数时编译失败
【发布时间】: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 上失败。

标签: c++ c++03


【解决方案1】:

(int[2]){0} 构造是 C99 复合文字,它不是 C++ 的一部分。任何人都可以猜测特定编译器在 C++ 上下文中的解释方式(或检查源代码的问题)。

PS。好的,看起来 gcc 4.7/gcc 4.8/clang-3.1 处理它相当明智 - 复合文字的类型与 C99 标准指定的相同。

我猜 OP 编译器有点老了。

【讨论】:

  • @Oswald,是的,我明白了。显然,这是编译器错误,自 4.6.3 以来已修复。
猜你喜欢
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多