[英]C++ constructor implicit conversion not happening
我定義了一個A類
class A{
public:
A(int){}
private:
A(const A&);
A& operator=(const A&);
};
我認為,因為我從int給出一個構造函數,所以隱式構造被授予......無論如何
A myA(7);
工作得很好,g ++給了我這一行:
A myA = 7;
以下錯誤:
Test02.cpp: In function ‘int main(int, char**)’:
Test02.cpp:5:3: error: ‘A::A(const A&)’ is private
Test02.cpp:12:12: error: within this context
另一個編譯器對此轉換感到滿意。 真相在哪里? 我應該如何定義A以便得到A myA = 7; 工作?
g ++是對的。 問題是
A myA = 7;
是復制初始化這意味着,在語義上,您在RHS上有一個隱式轉換為A
,然后是復制構造。 可以省略實際副本,但仍必須可以訪問復制構造函數。
另一方面,
A myA(7);
是直接初始化 。 這只需要轉換構造函數A(int)
。
更多關於直接初始化與拷貝初始化 這里 。
GCC是對的。 A myA(7);
是直接初始化 - 它使用帶有int
參數的構造函數初始化myA
。
A myA = 7;
是復制初始化 - 它使用int
構造函數初始化一個臨時A
對象,然后使用復制構造函數從此臨時文件初始化myA
。 雖然副本很可能在實踐中被省略,但它仍然必須是合法的。 並且sinec復制構造函數不可訪問,它失敗。
使A myA = 7;
工作,你必須使復制(或移動)構造函數可訪問 - 這基本上意味着將其公開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.