[英]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.