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

Her*_*esy 4 c++ arrays std initializer-list c++11

现在我有一个C++函数

void F( std::array<int,3> x )
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

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

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

std::array<int,3> x = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

但对于函数参数,代码

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

会使编译错误.


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


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

谢谢.

Mor*_*enn 11

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

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

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

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

作为奖励,您可以使用ideone 在线查看.

  • 我对此并不完全确定.标准在[array.overview]/2中说,数组是一个可以初始化的聚合,如`std :: array <int,3> a = {1,2,3};`.direct-init必须有两个大括号,`std :: array <int,3> a {{1,2,3}};` (3认同)
  • MSVC 2012不支持@Heresy Initializer-lists,请参阅[SO question](http://stackoverflow.com/questions/7421825/c11-features-in-visual-studio-2012),[MSDN参考](http: //msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx) (3认同)