c++ - 在 C++11 中返回右值引用或临时对象

标签 c++ rvalue-reference

<分区>

Effective Modern C++ item 12中,有一段关于C++11函数引用限定符的示例代码:

class Widget {
public:
    using DataType = std::vector<double>;
    …
    DataType& data() &            // for lvalue Widgets
    { return values; }            // return lvalue

    DataType data() &&            // for rvalue Widgets
    { return std::move(values); } // return rvalue
    …
private:
    DataType values;
};

那么为什么第二个data() rvalue reference overload function 返回一个temporary object DataType 而不是右值引用 DataType&&?

最佳答案

我看到的唯一原因是当对象是纯右值的结果时避免创建悬挂引用:

Widget foo();

auto&& x = foo().data();

如果 foo().data() 返回一个对 values 成员的右值引用,x 将是一个悬空引用,因为结果foo() 的对象在 x 的初始化结束时(完整表达式的结尾)被销毁。

另一方面,随着 data()&& 按值返回,x 被绑定(bind)到一个与 x 具有相同生命周期的临时物化。因此避免了悬空引用。

data() && 的返回类型在 C++ 中不是惯用的。通常,访问器函数返回一个引用,并且像上面这样的用例可能会引起任何代码审查者的“悬空引用警报”。

data()&& 的定义很聪明,但它打破了一个共同的约定。

关于c++ - 在 C++11 中返回右值引用或临时对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54378978/

相关文章:

c++ - 在 QML 信号中公开枚举

c++ - 我可以使用我称之为 "Raw OpenGL"的东西吗?

c++ - 如何设置、清除和切换单个位?

c++ - 在 C++17 中,为什么类模板与函数模板的指针类型推导明显不一致?

c++ - Const 右值编译器区别

安卓NDK |如何调试应用程序启动或暂停应用程序直到调试器连接

c++编译器如何知道参数是STL容器?

c++ - 如何从函数返回 && 对象?

c++ - 引用重载,而不是唯一的按值传递+ std::move?

c++ - 为什么用户定义的移动构造函数会禁用隐式复制构造函数?