gpt4 book ai didi

c++ - 返回值还是右值引用?

转载 作者:IT老高 更新时间:2023-10-28 23:21:31 26 4
gpt4 key购买 nike

在 Scott Meyer 的新书中,他提出了一个右值引用限定符的示例用法,如下所示:

class Widget {
private:
DataType values;

public:
DataType& data() & { return values; }
DataType data() && { return std::move(values); } // why DataType?
};

这样:

auto values = makeWidget().data();

move-constructs values 而不是复制构造它。

为什么右值引用限定的data()返回DataType而不是DataType&&auto 在那种情况下仍然会推断出 DataType (尽管 decltype(auto) 不会 - 但这不能是唯一喜欢的理由返回一个值而不是一个 ravlue ref)。 This高度投票的答案返回一个右值引用,这在概念上对我来说更有意义。

最佳答案

DataType data() && { return std::move(values); } // why DataType?

auto values = makeWidget().data();

保存返回值的临时变量将通过move-constructor初始化,从move(values)复制初始化。

然后临时初始化 values,但由于 makeWidget().data() 是一个右值(准确地说是纯右值),因此再次调用移动构造函数 - 使用临时作为它的论据。

现在考虑 copy-elision :

When a nameless temporary, not bound to any references, would be moved or copied into an object of the same cv-unqualified type, the copy/move is omitted. When that temporary is constructed, it is constructed directly in the storage where it would otherwise be moved or copied to. When the nameless temporary is the argument of a return statement, this variant of copy elision is known as RVO, "return value optimization".

因此,第二步将(可能)被完全忽略,只剩下一个 - 如果返回类型是右值引用,我们无论如何都会有这个。

返回右值引用的问题在于,如果我们写

auto&& values = makeWidget().data();

values 将悬空,因为将 xvalue 绑定(bind)到引用不会延长任何东西的生命周期。当我们返回对象类型时,临时对象的生命周期就会延长。

关于c++ - 返回值还是右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27368236/

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