2013-05-02 98 views
4

现在我在C++在std :: array中使用默认参数进行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


有什么办法让它有一个默认值?

谢谢。

+0

什么编译器错误?哪个编译器? (这可能是一个bug .. clang3.2接受你的代码;我认为你的例子符合标准 - 它是聚合初始化) – dyp 2013-05-02 11:20:14

+0

我已经添加了一个错误。 它看起来是我的编译器不支持这种语法呢...... – Heresy 2013-05-02 11:36:43

+1

我发现了一个愚蠢的解决方法...使用lambda表达式。 (void){(std :: array x = [](){std :: array x = {1,2,3}; return x;}()){}'这对MSVC11和G ++ 4.6都有效0.3。 – Heresy 2013-05-02 12:24:19

回答

11

您的解决方案应该按照标准工作,但在某些编译器中没有实现。它们中的大多数可以使用语法x = {{1,2,3}}初始化std::array的实例,而不是使用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。

+0

请注意,标准并不完全清楚数组成员的实现,这可能会导致混淆。 – juanchopanza 2013-05-02 10:17:29

+3

我不完全确定这一点。标准在[array.overview]/2中说,一个数组是一个聚合可以初始化为'std :: array a = {1,2,3};'。对于direct-init,必须有两个大括号,'std :: array a {{1,2,3}} ;' – dyp 2013-05-02 11:11:50

+0

@Morwenn 感谢您的回答,但代码在MSVC 2012中仍然会出现编译错误。 – Heresy 2013-05-02 11:24:16