2010-05-14 25 views
4

我讀了一些提振代碼,碰到這樣的:爲什麼賦值運算符會執行與其匹配構造函數不同的操作?

inline sparse_vector &assign_temporary(sparse_vector &v) { 
    swap(v); 
    return *this; 
} 
template<class AE> 
    inline sparse_vector &operator=(const sparse_vector<AE> &ae) { 
     self_type temporary(ae); 
     return assign_temporary(temporary); 
    } 

這似乎是所有構造函數映射到賦值運算符。大。但爲什麼C++選擇讓它們做不同的事情呢?我能想到的只有scoped_ptr?

回答

6

爲什麼C++選擇讓它們做不同的事情?

因爲賦值對完全構造的對象起作用。在資源管理類中,這意味着每個成員指針都已指向一個資源。將其與構造函數進行對比,在構造函數中,成員在執行之前沒有任何含義。

順便說一句,在C++的早期,T a(b);實際上定義爲T a; a = b;,但這被證明是低效率的,因此引入了複製構造函數。

2

注意名稱「assign_temporary」表示該賦值來自臨時對象,因此可以在賦值過程中銷燬。賦值運算符需要稍後使用的某些常規對象,因此在賦值期間不能將其銷燬。在這個Boost代碼中,「assign_temporary」與rvalue reference賦值運算符是同義的,而上面顯示的賦值運算符是標準const(左值)引用賦值運算符,因此,您會期望這兩種不匹配。

但我同意,賦值操作符通常是使用複製和交換技巧實現的(使用複製構造函數創建副本,然後與副本交換)。但是,該標準已經定義了編譯器在沒有明確定義的情況下自動實現賦值運算符,因此更改默認實現可能會破壞現有代碼。

1

出於某些類有時不應被分配或甚至複製的原因。例如,使用RAII,你可以建立一個互斥類,它打開一個鎖,然後在到期時關閉鎖。如果你被允許複製或分配這樣的類,你可以想象將它傳遞到函數範圍之外。這可能會導致壞人手中的壞事。

相關問題