加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 临时对象是xvalues吗?

发布时间:2020-12-16 03:34:05 所属栏目:百科 来源:网络整理
导读:我目前正在撰写我的学位论文,它还涉及对C 11背后的理论的一些解释,这是非常好的,因为C是我选择的编程语言,而且标准或多或少可以免费获得(N3337)让自己迷失. 然而,我试图准确而详细地解释新的xvalue类别时遇到了障碍.我的理解是临时对象总是一个xvalue但我在
我目前正在撰写我的学位论文,它还涉及对C 11背后的理论的一些解释,这是非常好的,因为C是我选择的编程语言,而且标准或多或少可以免费获得(N3337)让自己迷失.

然而,我试图准确而详细地解释新的xvalue类别时遇到了障碍.我的理解是临时对象总是一个xvalue但我在标准中找不到任何对此的引用.我的理解是函数的表达式的值类别调用具有非引用返回类型的函数是xvalue.标准说“xvalue是涉及rvalue-references的某种表达式的结果”,这让我烦恼.例如:

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

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

someFunction(createObject());

正如所料,上面将调用带有rvalue-reference作为参数的重载函数.然而,createObject()不返回rvalue-reference,它返回一个TestClass类型的临时对象.我现在的问题是,我必须解释其背后的原因.表达式“createObject()”评估为什么?如果它确实是一个xvalue,因为它返回一个临时对象,它背后的推理是明确的,并且在重载解析期间有利于rvalue-reference.如果没有,那么关于标准的这种行为的解释是什么?是否有某些我尚未找到的隐式转换逻辑?

如果有人能帮我解决这个问题,我真的很感激,因为即使经过几天的挖掘和阅读,我还没有想出一个合理的解释.非常感谢提前.

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读