2013-08-23 89 views
5

因爲我對這個問題的疑慮(對於C++ 03)我張貼它只是這兒過得閱讀轉換構造,並指出拷貝構造函數和一個轉換構造之間的困惑

「要是一個轉換構造函數,構造函數必須具有單個 參數,並且在沒有顯式關鍵字的情況下聲明。「

現在我的問題是複製構造函數是否可以被稱爲轉換構造函數提供它沒有明確聲明?它有資格成爲一個嗎? 我相信它不能被稱爲轉換構造函數,因爲它只接受相同的類型參數ths導致沒有轉換。例如

foo a; 
foo b; 
a = 100; //a Conversion constructor would be called (i.e) foo(int a){...} 
a = b ; //Since both objects are same type and have been initialized the assignment operator will be called (if there is an overloaded version otherwise the default will be called) 

我的理解是否正確?

+0

如果可能,'operator =()'將是首選,但真正的問題是「當找不到合適的'operator =()'實現時會發生什麼?」 – cdhowie

+0

foo a = 100; //是轉換結構 foo b = a; //是複製構造 –

+0

[class.conv.ctor]/3「非顯式拷貝構造函數(12.8)是一個轉換構造函數,隱式聲明的拷貝構造函數 不是一個顯式的構造函數;它可以被隱式調用類型轉換「。 – dyp

回答

0

是的,複製構造函數就是它 - 複製構造函數。這不是一個轉換構造函數,從一種類型轉換爲另一種類型。

+0

這應該是一個評論?你能修正語法嗎? –

+0

除了它是*是一個轉換構造函數。轉換到相同類型可能是微不足道的,但它在技術上仍然是一種轉換。 –

+0

修正語法,是否更清晰? –

10

引述標準:

[class.conv.ctor]/3

甲非顯式拷貝構造(12.8)是一轉換構造。一個隱式聲明的拷貝構造函數不是一個顯式的構造函數;它可能被稱爲隱式類型轉換。

所以是的,copy-ctor是一個轉換ctor。

還要注意[CONV]/1,指定並在備註中指出:

注:一個標準轉換序列可以是空的,即,它可以由任何轉換的。

和/ 3:

表達e可以隱式轉換到類型T當且僅當該聲明T t=e;是公形成

所以該組的隱式轉化包含空轉換。

+0

+1優秀參考報價 – sehe