临时对象是xvalues吗?

时间:2012-03-12 16:28:03

标签: c++ c++11 rvalue-reference xvalue

我目前正在撰写我的学位论文,它还涉及对C ++ 11背后的理论的一些解释,这很好,因为C ++是我选择的编程语言,而且标准或多或少是免费提供的(N3337)迷失自己。

然而,我试图准确而详细地解释新的xvalue类别时遇到了障碍。 我的理解是临时对象总是一个xvalue但我在标准中找不到任何对此的引用。我的理解是函数表达式的值类别调用一个函数有一个非引用返回类型,是一个xvalue。标准说“xvalue是涉及rvalue-references的某种表达式的结果”,这让我烦恼。例如:

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

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

someFunction(createObject());

上面将按预期调用重载函数,该函数将rvalue-reference作为参数。然而,createObject()不返回rvalue-reference,它返回一个TestClass类型的临时对象。我现在的问题是,我必须解释其背后的原因。表达式“createObject()”评估为什么?如果它确实是一个xvalue,因为它返回一个临时对象,它背后的推理是明确的,并且在重载解析期间有利于rvalue-reference。如果没有,那么关于标准的这种行为的解释是什么?是否有一些我尚未找到的隐式转换逻辑?

如果有人可以帮我解决这个问题,我真的很感激,因为即使经过几天的挖掘和阅读,我还没有想出一个合理的解释。非常感谢。

1 个答案:

答案 0 :(得分:11)

对象永远不会是{l | r | x}值。值类别描述表达式

xvalue 是函数调用表达式的值类别,其中函数返回类型是对象的右值引用(例如std::move),它也是强制转换的值类别表达式,其中强制转换为对象的右值引用(例如std::move的内容。)

示例中的函数调用表达式createObject() prvalue 表达式,因为它是对具有非引用返回类型的函数的函数调用。