- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在写我的学位论文,它还涉及对 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/
我是一名优秀的程序员,十分优秀!