2016-11-14 359 views
-1

下面的類聲明有什麼區別?A a有什麼區別?和A a();?

class A 
{ 
public: 
    A() 
    { 
     std::cout << "A()\n"; 
    } 
    ~A() 
    { 
     std::cout << "~A()\n"; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    A a; // <-- this call the constructor and destructor 
    A b(); // <-- this is not!! what is a b()? 
    return 0; 
} 

什麼是b()

回答

3

這是一個most vexing parse問題; C++規則的一個副作用是任何可以被解析爲 聲明的規則都必須被解釋爲一個。所以A b();是一個函數聲明,b是一個無用函數並且返回A

從C++ 11開始,可以使用大括號(list initialization)代替圓括號;因爲函數不能用參數列表的大括號來聲明,所以「歧義」消失。

A b{}; // calls A's default constructor 
+2

請不要回答明顯的錯誤 – NathanOliver

相關問題