2011-11-27 57 views
3

我想將第二個對象的臨時對象傳遞給另一個對象構造函數,以獲取生成的對象的所有權。我的代碼是這樣將r值傳遞給構造函數時有任何限制嗎?

class A { 
}; 

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

     void test(){ } 
}; 

int main(int argc, const char *argv[]) 
{ 
    B b(A()); 
    b.test(); 
    return 0; 
} 

,但我發現這個錯誤,我無法理解

$ g++ -std=c++0x main.cpp 
main.cpp: In function 'int main(int, const char**)': 
main.cpp:15:7: error: request for member 'test' in 'b', which is of non-class type 'B(A (*)())' 

也許這只是一個愚蠢的語法錯誤,但如果它不是,你將如何定義這樣的構造函數來獲得一些創建的資源的所有權?

感謝

+0

這是一個語法錯誤。你聲明瞭一個函數'b',取一個返回'A'的零adic函數,並返回'B'。 –

+1

[構造函數調用機制]的可能重複(http://stackoverflow.com/questions/4283576/constructor-invocation-mechanism) – Mat

+1

參見http://stackoverflow.com/questions/6690256/why-can-this-code -elide-a-copy,http://stackoverflow.com/questions/180172/why-is-it-an-error-to-use-an-empty-set-of-brackets-to-call-a-constructor -with-no – Mat

回答

3

你被所謂的C++的最棘手的解析抓獲。你行

B b(A()); 

定義與A類型的臨時對象初始化B類型的對象b,但聲明瞭一個功能命名b採取類型的未命名參數(指針)與功能沒有參數並返回A(因此b的參數類型被聲明爲函數類型A()並衰減到指針函數類型A(*)(),您可以在錯誤消息中看到),並返回B.

各地最簡單的方法是到該行更改爲

B b = B(A()); 

在C++ 11,最好的選擇是使用新的初始化語法,寫

B b { A() }; 
+1

或者,甚至更簡單:B b((A())) - 額外括號 –

+0

IMO,初始化語法更具可讀性。 – Jagannath

相關問題