2012-02-05 205 views
7

儘管我非常喜歡C++ 11中的新功能,但有時候我覺得我錯過了它的一些微妙之處。std ::數組初始化列表在初始化列表中初始化

初始化int數組工作正常,初始化Element2向量工作正常,但初始化Element2數組失敗。我認爲正確的語法應該是未註釋的行,但沒有任何初始化嘗試對我成功。

#include <array> 
#include <vector> 

class Element2 
{ 
    public: 
      Element2(unsigned int Input) {} 
      Element2(Element2 const &Other) {} 
}; 

class Test 
{ 
    public: 
      Test(void) : 
        Array{{4, 5, 6}}, 
        Array2{4, 5}, 
        //Array3{4, 5, 6} 
        Array3{{4, 5, 6}} 
        //Array3{{4}, {5}, {6}} 
        //Array3{{{4}, {5}, {6}}} 
        //Array3{Element2{4}, Element2{5}, Element2{6}} 
        //Array3{{Element2{4}, Element2{5}, Element2{6}}} 
        //Array3{{{Element2{4}}, {Element2{5}}, {Element2{6}}}} 
        {} 
    private: 
      std::array<int, 3> Array; 
      std::vector<Element2> Array2; 
      std::array<Element2, 3> Array3; 
}; 

int main(int argc, char **argv) 
{ 
    Test(); 
    return 0; 
} 

我已經在MinGW下的g ++ 4.6.1和4.6.2上試過了。

我應該如何正確地去初始化這個數組?可能嗎?

+0

我想這與初始化列表沒有太大的關係。編輯問題以使其更切合實際是否合適? – rendaw 2012-02-05 03:57:12

回答

6

對此的正確方法是Array{{4, 5, 6}}。當您使用集合初始化初始化成員時,不能省略大括號。你可以忽略括號中的唯一的一次是在形式

T t = { ... } 

所以你的情況,你必須鍵入的所有大括號的聲明:一爲std::array本身,以及一個用於int陣列。對於Array3,您的語法也是正確的,因爲int可以隱式轉換爲Element2

從剩下的評論者中,Array3{{{4}, {5}, {6}}},Array3{{Element2{4}, Element2{5}, Element2{6}}}Array3{{{Element2{4}}, {Element2{5}}, {Element2{6}}}}也可以工作,但更羅嗦。然而,在概念上Array3{{{4}, {5}, {6}}}一個產生最少數量的臨時實施不做複製elision(我猜這是無關的,但仍然很好知道),甚至比Array3{{4, 5, 6}}一個,因爲不是複製初始化你使用複製列表初始化爲您的Element2,它不會產生中間臨時設計

+0

你是說它應該可以正常工作,並且GCC壞了?因爲OP在說所有這些變化都失敗了。另外,這是如何工作的,因爲'std :: array '不是一個聚合?我可以引用規範的聚合要求,而'std :: array '沒有通過測試。你能否引用關於如何通過聚合初始化來初始化非聚集的規範?我不是說你錯了。我毫不猶豫地承認我從未完全閱讀過C++ 11規範。同時,我希望您的聲明的真實性有一些證據。 – 2012-02-05 15:29:19

+1

@NicolBolas據我所知,'std :: array '是一個聚合體:它是一個沒有用戶定義的構造函數的結構 - 它在''的描述中被明確提及爲聚合體。 – hvd 2012-02-05 19:24:16

+0

@nico什麼hvd說 – 2012-02-05 19:32:39