簡體   English   中英

為什么調用復制構造函數而不是轉換構造函數?

[英]Why is copy constructor called instead of conversion constructor?

所以基本上這段代碼:

class A {
};
class B { 
   B (const B& b) {}
public: 
   B (){}
   B (const A& a) {} 
};

int main()
{
   A a;
   B b1(a);  //OK
   B b2 = a; //Error
}

只會為B b2 = a生成錯誤。 而那個錯誤是

錯誤:'B::B(const B&)' 是私有的

為什么除了直接轉換構造函數之外還要嘗試調用復制構造函數?

從錯誤消息中可以清楚地看出,創建了一個臨時B ,然后將其用於復制構造,但為什么呢? 這在標准中的什么位置?

B b2 = a;

這稱為復制初始化

它執行以下操作:

  1. 使用B (const A& a)a創建類型B的對象。
  2. 使用B (const B& b)將創建的臨時對象復制到b2
  3. 使用~B()銷毀臨時對象。

您得到的錯誤不是在第 1 步,而是在第 2 步。

這在標准中的什么位置?

C++03 8.5 初始化器
第 14 段:

....
— 如果目標類型是(可能是 cv 限定的)類類型:
...
...
— 否則(即,對於剩余的復制初始化情況),可以從源類型轉換為目標類型或(當使用轉換函數時)到其派生類的用戶定義的轉換序列如 13.3 中所述進行枚舉.1.4,最好的一個是通過重載決議(13.3)選擇的。 如果轉換無法完成或不明確,則初始化格式錯誤。 選擇的函數以初始化表達式作為參數調用; 如果該函數是構造函數,則調用會初始化目標類型的臨時對象。 調用的結果(對於構造函數情況是臨時的)然后根據上述規則用於直接初始化作為復制初始化目標的對象。 在某些情況下,允許實現通過將中間結果直接構建到被初始化的對象中來消除直接初始化中固有的復制; 見 12.2、12.8。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM