c++ - 临时对象是 xvalues 吗?

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

我目前正在写我的学位论文,它还涉及对 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,因为它返回一个临时对象,那么它背后的原因很清楚,并且右值引用在重载决策期间受到青睐。如果不是,那么根据标准对这种行为的解释是什么?是否在某处定义了一些我尚未找到的隐式转换逻辑?

如果有人能帮助我解决这个问题,我将不胜感激,因为即使经过数天的挖掘和阅读,我仍未得出合理的解释。非常感谢。

最佳答案

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

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

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

关于c++ - 临时对象是 xvalues 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9670954/

相关文章:

c++ - 有什么方法可以将右值/临时对象传递给需要非成本引用的函数?

c++ - C++11 中operator=(std::promise &&) 的结果是什么?

c++ - 不同的构造函数调用取决于编译器

c++ - 如何找出键盘的地址

c++ - 将本地字符串参数作为对 const 的引用传递到 constexpr 函数中?为什么这是合法的?

c++ - 对 std::optional 使用 std::iter_swap

C++ 如何将 std::mutex 和 std::lock_guard 与仿函数一起使用?

c++ - 如何在不删除的情况下将\x1\x2\x3 ...字符转换为普通字符?

c++ - QT 将小部件转换到组合框

c++ - 跳过显式模板初始化以避免双重初始化