數組

2015-12-28 43 views
1

上調用賦值運算符我不知道這個代碼可以工作:數組

struct my_array 
{ 
    int r[1000]; 
}; 

int main() 
{ 
    my_array foo, bar; 
    foo = bar; 
} 

因爲foo = bar通話將調用構造函數提供的類,它會懶洋洋地運用它的每一個成員operator=。但是數組沒有對operator=的實現,證明,這段代碼不能通過編譯:

int main() 
{ 
    int a[1000], b[1000]; 
    a = b; 
} 

那麼怎麼來的我的第一個代碼編譯?

+4

因爲struct類似'class'es,它有一個默認的'operator ='來複制每個成員。 –

+1

@DavidSchwartz是嗎?這就是我寫的,默認的'operator ='被調用,這又會在每個成員上應用'operator =',我的問題是:這個工作如何給出數組沒有'operator ='(即' t被複制) – qdii

+1

默認'operator ='複製每個成員。它不一定會調用'operator =',除非這是複製它們的適當方式。爲什麼要用'int r [2];''struct'與'int r1,r2;''複製一個'struct'? –

回答

6

那麼我的第一個代碼是如何編譯的呢?

語言規範說它必須工作,並且編譯器實現該行爲。

默認分配語義在§12.8[class.copy]的第28節中指定。具體而言,對象的數據成員被逐一分配。在數組的情況下,這個數組的元素被逐一分配。

用於 非工會類X 執行成員逐一禁止複製/移動分配其 子對象的隱式定義的複製/移動賦值運算符。 ...

- 如果子對象是一個數組,的每個元素分配,在適於所用元素類型的方式;

(重點煤礦)


注意,在你的具體的例子,第一個代碼示例調用未定義行爲因爲bar的元素在你從他們在這裏讀的那一刻未初始化:

foo = bar; // UB: bar.r uninitialized 

您可以通過適當的初始化來修復bar

my_array foo; 
my_array bar{}; 
+0

因此該標準指定了「複製」數組的含義。我猜爲什麼'operator ='沒有爲一個數組定義的唯一原因是當數組衰減爲指針時它會導致混亂? – qdii

+0

@qdii它是一個從C繼承的混亂。它很難與指針衰減(特別是數組函數參數調整)調和數組的副本,儘管我沒有看到明顯的賦值問題。但它是這樣的,它不能改變。 – juanchopanza