我已經查看了auto_ptr <>和auto_ptr_ref <>的內部實現的不同來源。我有這個問題,我不明白爲什麼。auto_ptr_ref執行問題
....從函數中返回'auto_ptr'時,編譯器發現沒有合適的ctor來構造返回的對象。但是有轉換到'auto_ptr_ref'和ctor採取'auto_ptr_ref'構造'auto_ptr'。因此,編譯器創建一個'auto_ptr_ref',它基本上只保存對原始'auto_ptr'的引用,然後從這個對象構造'auto_ptr'。這一切(當然,返回一個對象時,編譯器都會經歷這個過程通常兩次,因爲返回的值是地方複製,但是這並不能改變過程).... (參考http://www.josuttis.com/libbook/auto_ptr.html)
在這例如,我模仿的auto_ptr <的實施>和auto_ptr_ref <>和能夠產生結果顯示的確是編譯器穿過過程兩次
的例子具有以下基本特徵:
1)A的拷貝構造函數不需要const引用。 2)A有轉換運算符B 3)A有構造函數A(B);
class B {
};
class A {
public:
A() {
printf("A default constructor() @ %p\r\n", this);
}
A(B) {
printf("constructor(B) @ %p\r\n", this);
}
A (A &a) {
printf("copy constructor(non-const) @ %p\r\n", this);
}
operator B() {
printf("A convertion constructor(B) @ %p\r\n", this);
return B();
}
};
A foo()
{
return A();
}
int main()
{
A a(foo());
}
所以當A中的(FOO()))執行
1)FOO()生成臨時對象X 2)X轉化爲B型 3)構造A(B )用於構造對象一個
這是輸出:
A default constructor() @ 0xbfea340f
A convertion constructor(B) @ 0xbfea340f
constructor(B) @ 0xbfea344f
A convertion constructor(B) @ 0xbfea344f
constructor(B) @ 0xbfea344e
我們可以看到編譯器通過兩次轉換構建步驟2。
這是爲什麼?
'auto_ptr'是一個主要的PITA,即使對於編譯器廠商來說也是如此,而這個'auto_ptr_ref'的複雜性已經幫助了它的命運。現在已棄用。 – MSalters