2014-04-21 123 views
2

我知道下面的語句工作集合初始化 - 矢量和陣列

std::vector<int> a{1,2,4} --->A (Aggregate Initialization) 

或聲明如下(S)

std::vector<int> a; 
a = {1,2,4};    ---->B Variable already initialized. - Then aggregate initialization is called 

然而,在陣列的情況下

int c[3]={1,4}; ---->C (1,4,0) 

然而,以下是不允許的

int c[3]; 
c = {1,4}; ---->D 

現在我的問題是爲什麼B工作和D不?

+1

大多無關,但如果你不知道這件事,有一個'的std ::陣列'類:http://en.cppreference.com/w/cpp/container/array –

+0

@Casey是的,它修復了它 – Rajeshwar

回答

2
std::vector<int> a{1,2,4}; 

這是初始化列表初始化,不聚集,因爲vector不是彙總 - 它的數據存儲在堆上。您需要有#include <initializer_list>才能正常工作,但該標頭通常包含在<vector>之間。

a = {1,2,4}; 

這也經過重載上std::initializer_list的功能,並且所述語義是相同的函數調用:

a.assign({1,2,4}); 
int c[3]={1,4}; 

聚合初始化。然而,之後你不能執行c = { 3, 5, 6 },因爲braced-init-lists可能只是新變量的初始值,而不是內置表達式的操作數。 (在聲明中,=符號只是初始化的符號,它不是通常的操作符,賦值運算符的語法明確允許使用括號列表,但是這種用法僅適用於函數重載,這會導致列表初始化一個新的變量:函數參數。)

最後一個問題的答案是,沒有辦法爲「裸」數組編寫必要的operator =重載,因爲它必須是成員函數。解決方法是使用std::copystd::initializer_list對象。

+0

感謝您的清除 – Rajeshwar

+0

爲什麼'c = {1,4}'不工作是不正確的,brace-init列表* *可以用在任務的RHS中(參見我的答案)。這裏的問題是數組不可分配。 – juanchopanza

+2

@juanchopanza哎呀,我不完全糾正這一點。問題是,正如最後一段所說,沒有辦法爲C風格的數組定義'operator =',因爲它必須是成員函數。 – Potatoswatter

4

正如在其他答案中已經解釋過的,這個任務的機制是向量的std::initializer_list assignment operator。這使得以下可能具有任意值的大括號括初始化列表,儘管不是聚合std::vector<int>

std::vector<int> a; 
a = {1,2,4};  // OK, vector& operator=(std::initializer_list<T>) 

但是以下是不允許

int c[3]; 
c = {1,4}; // Error: arrays are not assignable 

這是因爲陣列是不可轉讓。如果它是一種不同類型的聚合體,那麼這將起作用。例如,

struct Foo { int a, b, c; }; // aggregate 
Foo f = {1, 2, 3};   // OK, aggregate initialization 
f = { 1, 4 };    // OK 

這裏,f.af.bf.c分別分配的值1, 4, 0

此外,還可以初始化非聚集,並在具有帶有與列表元素兼容的參數列表的非構造函數(非explicit)的帶括號的初始化程序列表中進行賦值。例如,

struct Bar 
{ 
    Bar(int a, int b, int c) : a(a), b(b), c(c) {} // non-aggregate 
    int a, b, c; 
}; 

Bar b0 = {1, 2, 3}; // OK 
Bar b1 = {1,2};  // Error: number of elements must be 3 
b0 = {11, 22, 33}. // Assignemnt OK 
+0

我不認爲這個語法是特定於聚合。您正在使用通過聚合初始化生成的臨時調用隱式賦值運算符。對於非聚合,braced-init-list將用於選擇構造函數。此外,+1,因爲我不知道這種用法! – Potatoswatter

+0

@Patatoswatter我不是說它不適用於非聚合,但它適用於不是數組的聚合。我會盡力澄清這一點。 – juanchopanza