簡體   English   中英

C ++構造函數隱式轉換沒有發生

[英]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.

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