簡體   English   中英

整數向量向量的統一初始化

[英]Uniform initialization on a vector of vectors of integers

C ++ 11

程序初始化vector ,命名myVec ,的int vector s,然后使用循環來打印出每個內vector的元素。 但是當我試圖看到當我使用額外的花括號時會發生什么,我得到了意想不到的結果。 以下內容也適用於此LiveWorkSpace ,以便在編譯器之間輕松切換。 g++ 4.8.0只能編譯到myVec[5] clang++ 3.2編譯所有內容:

#include <iostream>
#include <vector>

int main()
{
    std::vector<std::vector<int>> myVec =
    {
        /* myVec[0] */ {1, 2},
        /* myVec[1] */ {},
        /* myVec[2] */ {{}},
        /* myVec[3] */ { {}, {} },
        /* myVec[4] */ { {}, {}, {} },
        /* myVec[5] */ {{{}}}

        /* myVec[6] */  // , { {{}}, {{}} }       // g++ 4.8.0 COMPILER ERROR
        /* myVec[7] */  // , {{{{}}}}             // g++ 4.8.0 COMPILER ERROR
        /* myVec[8] */  // , { {{{}}}, {{{}}} }   // g++ 4.8.0 COMPILER ERROR
    };

    // loop for printing
    for (unsigned int i = 0; i < myVec.size(); ++i)
    {
        std::cout << "myVec[" << i << "]: ";
        for (unsigned int j = 0; j < myVec.at(i).size(); ++j)
        {
            std::cout << myVec.at(i).at(j) << ", ";
        }
        std::cout << std::endl;
    }
    return 0;
}

實際g++ 4.8.0輸出:

myVec[0]: 1, 2,
myVec[1]:
myVec[2]: 0,
myVec[3]: 0, 0,
myVec[4]: 0, 0, 0,
myVec[5]: 0,

分析:

myVec[0]{1, 2}

得到預期的輸出。

myVec[1]{}

得到預期的輸出。

myVec[2]{{}}

這是int 0的向量。 內部大括號將int初始化為0

myVec[3]{ {}, {} }

兩個內括號將int初始化為0

myVec[4]{ {}, {}, {} }

三個內括號將int初始化為0

myVec[5]{{{}}}

我想在myVec[2]添加另一組花括號,看看在獲得編譯錯誤之前我可以添加大括號。 我不明白為什么這個編譯以及為什么它的元素打印為0

例如, int j = {}j初始化為0 vector<vector<int>> v = { {{}} }將最內層{} vector<vector<int>> v = { {{}} }初始化為int 0 ,使其等效於vector<vector<int>> v = { {0} } 那么,什么是vector<vector<int>> u = { {{{}}} } ,為什么會編譯?

假設的myVec[6]{ {{}}, {{}} }

按照與上面相同的模式,我想制作一個包含兩組雙花括號的矢量。 但這不能編譯,我不明白為什么這會打破給我多個零的模式。

假設的myVec[7]{{{{}}}}

我想在myVec[5]添加另一組花括號,看看在獲得編譯錯誤之前我可以添加大括號。 我不明白為什么這會破壞模式並且不會編譯。

假設的myVec[8]{ {{{}}}, {{{}}} }

我想擴展myVec[7]來制作一個帶有兩組三重括號的向量。 我不明白為什么這也不編譯。

如果myVec[5]所有內容都編譯好了,為什么不呢?

嘗試編譯此代碼。 它應該解釋你的問題:

int i = {};   // initializes i to int()
int j = {{}}; // fails to compile

為什么在您的代碼中接受{{{}}}似乎是一個gcc錯誤(需要澄清)與ctor的處理方式有關:

struct foo {
    foo( std::initializer_list<int> ) {}
};
void f()
{
   foo bar1( {{{}}} ); // compiles fine
   foo bar2 = {{{}}}; // compiles fine
}

編輯(感謝Johannes Schaub) - 刪除復制ctor使第一個變體無法編譯:

struct foo {
    foo( std::initializer_list<int> ) {}
    foo( const foo& ) = delete;
};
void f()
{
   foo bar1( {{{}}} ); // fails to compile: use of deleted function ‘foo::foo(const foo&)’
   foo bar2 = {{{}}}; // still compiles, neither deleting move ctor, nor assignment operator does not affect that, is copy ctor of std::initializer_list involved?
}

對於成員函數,它失敗了:

struct foo {
    void moo( std::initializer_list<int> ) {}
};
void f()
{
   foo bar;
   bar.moo( {{{}}} ); // fails to compile
}

此代碼也失敗了:

std::initializer_list<int> l = {{{}}}; // fails to compile

相同的情況ctor vs std :: vector的成員函數:

void f()
{
    std::vector<int> v( {{{}}} ) // compiles fine;
    v.assign( {{{}}} ); // fails to compile
};

gcc版本4.7.2(Ubuntu / Linaro 4.7.2-2ubuntu1)

暫無
暫無

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

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