我目前正在写我的学位论文,它还涉及对 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,因为它返回一个临时对象,那么它背后的原因很清楚,并且在重载决议期间,右值引用更受青睐。如果没有,关于标准的这种行为的解释是什么?是否在某个地方定义了一些我还没有找到的隐式转换逻辑?
如果有人可以帮助我解决这个问题,我将非常感激,因为即使经过几天的挖掘和阅读,我还没有提出合理的解释。提前非常感谢。