gpt4 book ai didi

c++ - 为什么函数表达式返回的非引用类型被认为是纯右值而不是亡值?

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

标准中的

§ 3.10.1.5prvalue 表达式定义为:

— A prvalue (“pure” rvalue) is an rvalue that is not an xvalue. [ Example: The result of calling a function whose return type is not a reference is a prvalue. The value of a literal such as 12, 7.3e5, or true is also a prvalue. — end example ]

因此函数 foo() 是一个 prvalue 表达式:

class Foo {}; 
Foo foo() { return Foo{}; }

要将左值引用初始化为非 volatile 常量类型/右值引用,初始化表达式必须是(§ 5.2.1.1 ):

[...] an xvalue (but not a bit-field), class prvalue, array prvalue or function lvalue and “cv1 T1” is reference-compatible with “cv2 T2”, or [...]

因此,

Foo &&rrFoo_ = foo(); 

是有效代码,其中 rrFoo_ 绑定(bind)到一个临时对象以延长对象的生命周期 (§12.2):

Temporaries of class type are created in various contexts: binding a reference to a prvalue (8.5.3), returning a prvalue (6.6.3), a conversion that creates a prvalue (4.1, 5.2.9, 5.2.11, 5.4), throwing an exception (15.1), and in some initializations (8.5).

如上所述并忽略 RVO,以下对 Foo 类型对象的初始化将从默认构造的对象复制移动构造一个临时对象。然后将用于复制移动的临时对象构造名为 obj_foo 的最终对象:

Foo obj_foo{ foo() }; 

因此,在这两种情况下,我们要么窃取,要么甚至延长临时对象的生命周期,否则临时对象将被销毁。

§3.10.1.2 将 xvalues 定义为:

An xvalue (an “eXpiring” value) also refers to an object, usually near the end of its lifetime (so that its resources may be moved, for example). [...]

我想不出任何没有创建临时对象的情况。所以我的问题是,为什么像 foo() 这样的函数表达式被认为是 prvalue 表达式,即使它们至少具有与 x值

最佳答案

给定 int f1()int && f2()decltype(f1())int decltype(f2())int &&。实现这一点的方法是指定 f1() 是一个纯右值,f2() 是一个亡值。 decltype 然后查看给定表达式是纯右值、亡值还是左值。如果 f1()f2() 都是 xvalues,同样的区别仍然需要以其他方式进行。

关于c++ - 为什么函数表达式返回的非引用类型被认为是纯右值而不是亡值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42043414/

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