2012-03-12 59 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