2017-11-11 177 views
0

我有2個測試類:C++嵌套構造函數調用問題

class B { 
    public: 
    B(int i) { 
     qDebug() << "B constructor "; 
    } 
}; 

class A { 
    public: 
    A(B b) { 
     qDebug() << "A constructor "; 
    } 
}; 

現在我想建立與B A的對象,這就是我做什麼:

int i = 5; 
A test (B(i)); //does not work 

代碼編譯沒有錯誤,但第二行根本不執行。我做了一些測試,下面的代碼工作得很好:

int i = 5; 
A test (B((int)i)); //works 

A test (B(5)); //works 

所以,我想編譯器不能解釋的「i」爲INT乙構造函數調用裏面,但是爲什麼呢?

回答

0

此:

A test(B(i)); 

是一樣的:

A test(B i); 

這是一個函數聲明,而不是一個呼叫由於most vexing parse來構造函數。 有,指出(S.邁爾斯,「有效的現代C++」)的規則:

任何可以被解析爲聲明必須被解釋爲 一個

爲了避免使用支撐初始化(而不是括號())的功能,不能與{}括號聲明:

A test{B(i)}; 

話雖這麼說,有沒有「嵌套構造CA lls「在你的例子中。

+0

是的,謝謝,這解釋了很多.. C++永遠不會「驚歎」我 –