要麼給test
一個移動構造函數:
test(test&&) = default;
,或者使用直接初始化:
test a{item{10}};
沒有其他的解決方法。如果目標類型是類類型(例如test a = item{10};
),則複製初始化通常需要可調用的副本或移動構造函數。
相關規則在第8.5節[dcl.init]/P17指定:
如果目標類型是(可能CV修飾)類類型:
- 如果初始化是直接初始化,或者如果是複製初始化,其中源的cv非標準版本與目標的類別相同,或者目標的類別的派生類別被考慮。枚舉適用的構造函數 (13.3.1.3),最好的選擇是通過過載 分辨率(13.3)。調用如此選擇的構造函數以初始化 對象,初始化表達式或表達式列表作爲其參數 。如果沒有構造函數應用,或重載分辨率不明確,則初始化格式不正確。
- 否則(即,對於剩餘的複製的初始化情況),用戶定義的轉換序列,其可以從源 類型轉換爲目標類型或(當使用的轉換函數) 派生類其被列舉如13.3.1.4, 中所述,最好的選擇是通過重載分辨率(13.3)。如果 轉換無法完成或不明確,則初始化爲 格式不正確。使用初始化程序 表達式作爲其參數調用所選函數;如果該函數是一個構造函數,則調用 將初始化 目標類型的cv不合格版本的臨時值。臨時是一個prvalue。調用 (這是構造函數的臨時情況)的結果然後用於根據上面的規則對 進行直接初始化,即 的對象是複製初始化的目標。在某些情況下,通過將中間結果直接構造 到被初始化的對象中,可允許實現消除該直接初始化中固有的複製;見12.2,12.8。
源的類型爲item
,目的地類型爲test
,它的拷貝初始化,所以它屬於第二個小點之下。只有一個使用test(const item& a)
構造函數的可用轉換,所以test
類型的臨時值是從item
構造的,然後用於根據第一個項目符號點直接初始化目標。這又必須調用構造函數test
,它可以接受const test &
或test &&
參數。即使複製或移動消失,您仍然必須擁有這樣的構造函數。
給'test'一招如果可以的話可以使用構造函數,或者如果不能使用直接初始化語法。 – 2014-08-31 07:07:18
你使用哪個編譯器和版本? – 2014-08-31 07:08:20
@IanCook:添加版本 – w00d 2014-08-31 07:08:59