gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:26:46 26 4
gpt4 key购买 nike

我目前正在写我的学位论文,它还涉及对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com