簡體   English   中英

std :: array初始化列表初始化列表中的初始化

[英]std::array initializer list initialization in initialization list

盡管我非常喜歡C ++ 11的新功能,但有時我仍感覺缺少其某些細微之處。

初始化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上嘗試過這個。

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

解決此問題的正確方法是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}}}}工作,但比較羅word。 但是從概念Array3{{{4}, {5}, {6}}}會在不執行復制省略的實現上產生最少的臨時數量(我想這是無關緊要的,但還是很容易知道),甚至更少而不是Array3{{4, 5, 6}} ,因為您不是使用復制初始化,而是使用Element2復制列表初始化,這在設計上不會產生中間臨時對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM