7

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

然而,当我试图准确而详细地解释新的 xvalue 类别时,我碰壁了。据我了解,临时对象始终是 xvalue,但我在标准中找不到对此的任何引用。据我了解,对具有非引用返回类型的函数的函数调用表达式的值类别是 xvalue。该标准说“xvalue 是某些涉及右值引用的表达式的结果”,这让我很烦恼。例如:

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

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

someFunction(createObject());

正如预期的那样,上面将调用以右值引用作为参数的重载函数。然而 createObject() 不返回一个右值引用,它返回一个 TestClass 类型的临时对象。我的问题是现在,我必须解释它背后的原因。表达式“createObject()”的计算结果是什么?如果它确实是一个 xvalue,因为它返回一个临时对象,那么它背后的原因很清楚,并且在重载决议期间,右值引用更受青睐。如果没有,关于标准的这种行为的解释是什么?是否在某个地方定义了一些我还没有找到的隐式转换逻辑?

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

4

1 回答 1

12

Objects are never {l|r|x}values. value categories describe expressions.

xvalue is the value category of the function call expression where the function return type is an rvalue reference to object (e.g. std::move), and it is also the value category of the cast expression where the cast is to an rvalue reference to object (e.g. the guts of std::move).

The function call expression createObject() in your example is an prvalue expression because it is a function call to a function with non-reference return type.

于 2012-03-12T16:32:15.503 回答