2013-05-02 101 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