2013-01-07 73 views
1

可能重複:
When can outer braces be omitted in an initializer list?的std ::陣列隱式初始化

我在Visual Studio 2010中,這實際上是std::tr1::array,我運行到使用std::array一個惱人的問題。例如,我有一個以array作爲參數的函數。

void do_something(std::tr1::array<int, 5> data)

調用像do_something({1,2,3});函數沒有編譯錯誤工作和結果,但是

std::tr1::array<int, 5> data = {1,2,3}; 
do_something(data); 

一樣。我真的不明白爲什麼前者不行。我得到的錯誤告訴我,我在{之前錯過了)。這使我相信它不期待一個初始化列表,但我不明白爲什麼不。我濫用初始化列表嗎?

編輯:std::tr1::array是沒有必要的,std::array工作正常..

回答

3

試試這個

do_something({{1,2,3}}); 

std::array使用2套大括號的初始化,但在某些情況下(如例子中,你發佈)你可以消除外層的假支架。這可能幫助:需要C++11: Correct std::array initialization?

+0

同樣在這裏,相同的編譯器。 –

+0

它適用於我的GCC:http://stacked-crooked.com/view?id=0db4e5670d751282ca5cd244708bd38a我想MSVC不支持大括號初始化完全。 – Pubby

+0

嗯,我看,好,謝謝 –

3

額外的支撐,因爲std::array是一個聚集和POD,不像在標準庫中其他容器。 std::array沒有用戶定義的構造函數。這是第一個數據成員是大小N(其傳遞作爲模板參數)的陣列,並且該部件直接與初始化初始化。需要用於內部陣列,其直接被初始化的額外支撐。

認爲這是:

struct A 
{ 
    int data[2]; 
}; 

當您創建的A實例有多少括號需要什麼?

A a{1,2};  //wrong as per the Standard (the compiler might allow it) 
A b{ {1,2 } }; //correct 

b,外對{}用於結構,和內對{}用於構件陣列

希望有所幫助。

+0

這是有道理的,但顯然不是我的編譯器!猜猜它在VS2010中不完全支持。 – user1520427

+0

@ user1520427:編輯我的答案。 – Nawaz