一、可默認構造的,也即具有public的default constructor,不論是用戶顯式定義還是編譯器默認的,但是用戶定義的帶參數(shù)constructor會仰制編譯器合成default constructor,實際上并非任何情況下任意一種容器要求其元素類型滿足這一條件,特別是關聯(lián)式容器,因為只有序列式容器的某些函數(shù)才可能明確地或隱含地使用元素類型的default constructor,如果你不調用這樣的成員函數(shù),編譯器就不需要元素類型的默認構造函數(shù)。
二、可拷貝構造和拷貝賦值的,既具有public的copy constructor和copy assignment operator,不論是編譯器默認還是operator,如果沒有顯式定義它的話,這個條件可歸結為:元素必須是拷貝的,但實際上拷貝賦值的要求也不是強制的,原因和default constructor類似。
三、具有public的destructor,不論是編譯器默認的還是用戶顯式定義的。
四、對于關聯(lián)式容器,要求其元素必須是可比較的。
Auto_ptr滿足上述條件嗎?至少滿足前三條,因此至少可以作為序列式容器的元素,如果為auto-ptr定義了比較運算符的話,應該還可以把它作為關聯(lián)式容器的元素。
但是auto_ptr的特點是接管和轉移擁有權,而不是像原始指針那樣可以共享實值對象,即auto_ptr在初始化時接管實值對象和擁有權,而在拷貝時會交出實值對象及其擁有權。
因此,auto_ptr對象和它的拷貝不會共享實值它的拷貝并不相同,然而根據(jù)STL容器值語義的要求,可拷貝構造意味著一個著把一個對象賦值給另一個同類型對象將產生兩個相同的對象,顯然,auto_ptr不能滿足這一要求,與上面結論矛盾!那么問題出在哪里呢?
在揭開auto_ptr的之前需要了解copy constructor和copy assignment operator,的幾種合法形式,任何一個類都允許兩種形式的copy constructor:
C(const C©);
C(C©);
同樣,copy assignment operator允許類似的兩種形式。
C& operator=(const C ©);
C& operator=(C & copy);
實際上,由于copy assignment operator為普通的運算符重載成員函數(shù),因此還可以定義下列形式賦值函數(shù);
C&operator=(C copy);
如果要防止用戶把一些不合適的對象放入容器中,就要求對象的設計和是實現(xiàn)者使用一些語言支持但不常用的特征,也就是說,要能夠在編譯階段就阻止這種具有潛在危險性的行為,常用的方法就是迫使其違反C++靜態(tài)類型安全規(guī)則。
源處:
http://www.lirenedu.org/index.php?ack=xinwen&id=1178