2012-03-12 63 views
5

我目前正在寫我的學位論文,它也涉及到一些C++ 11背後的理論解釋,它非常好,因爲C++是我選擇的編程語言,並且標準可以免費獲得(N3337)自己迷失了。是否是臨時對象xvalues?

然而,我試圖準確而詳細地解釋新的xvalue類別時遇到了困難。 這是我的理解,臨時對象始終是一個xvalue,但我無法在標準中找到任何對此的引用。 我的理解是,對具有非引用返回類型的函數的函數調用表達式的值類別是xvalue。該標準說,「一個xvalue是涉及右值引用的某種表達式的結果」,這正在擾亂我。例如:

TestClass { ... }; 
testClass createObject() { return testClass(); } 

void someFunction(TestClass& testClass) { ... } 
void someFunction(TestClass&& testClass) { ... } 

someFunction(createObject()); 

以上將按預期調用重載函數,該函數以rvalue-reference爲參數。然而,createObject()不返回一個右值引用,它返回一個TestClass類型的臨時對象。我現在的問題是,我必須解釋它背後的原因。表達式「createObject()」評估的是什麼?如果它確實是一個xvalue,因爲它返回一個臨時對象,其背後的推理是清晰的,並且在重載解析期間右值引用是有利的。如果沒有,這個標準的行爲解釋是什麼?是否有一些隱式轉換邏輯定義在我還沒有找到的地方?

如果有人能幫我解決這個問題,我真的很感激,因爲即使經過了幾天的挖掘和閱讀,我還沒有想出一個合理的解釋。提前致謝。

+0

[相關問題](http://stackoverflow.com/questions/6609968/) – fredoverflow 2012-03-12 17:33:39

回答

10

對象永遠不會{l | r | x}個值。值類別描述表達式

x值是函數調用表達式其中函數返回類型是一個rvalue參照對象(例如std::move)的值的類別,並且它也是鑄表達式的值的類別,其中所述轉換是到一個rvalue參考對象(例如std::move的膽量)。

在您的示例中函數調用表達式createObject()前值表達式,因爲它是對帶有非引用返回類型的函數的函數調用。

+0

我知道類別只適用於表達式。 :)對不起,我在我的帖子中不清楚,並會暫時糾正它。 我現在覺得很愚蠢 - 真的很蠢。我不知道我在想什麼,將帶有非引用返回類型的函數調用表達式視爲一個xvalue。 非常感謝。而且我最好離開現在躲起來...... :( – khaos 2012-03-12 16:43:26