在std :: array中使用默认参数调用C ++函数?

时间:2013-05-02 10:04:15

标签: c++ arrays c++11 std initializer-list

现在我有一个C ++函数

void F( std::array<int,3> x )
{
    //...
}

我希望参数'x'可以有一个默认值,我该怎么做?

如果不是函数参数,我可以简单地使用

std::array<int,3> x = {1,2,3};

但对于函数参数,代码

void F( std::array<int,3> x = {1,2,3} )
{
    //...
}

会使编译错误。


我在MSVC 2012中测试,并得到错误C2143,C2059,C2447。 还有g ++ 4.6.3中的错误


有没有办法让它有默认值?

感谢。

1 个答案:

答案 0 :(得分:11)

您的解决方案应该按照标准运行,但在某些编译器中没有实现。他们中的大多数可以使用语法std::array初始化x = {{1,2,3}}的实例,而不是使用x = {1, 2, 3}。如果您希望它在今天起作用,您的功能应该是:

void F( std::array<int,3> x = {{1,2,3}} )
{
    //...
}

这是因为std::array下面只有一个C数组,并用aggregate initialization初始化它。第一对大括号用于列表初始化列表,而第二对大括号用于C数组初始化。

根据标准(8.5.1.11),如果(并且仅当)使用符号=进行初始化,则可以在这种情况下省略外括号。但是,有些编译器仍然不支持这种行为(g ++就是其中之一)。

作为奖励,you can check it online与ideone。