c++ - 通过右值引用返回更有效吗?

标签 c++ c++11 rvalue-reference

例如:

Beta_ab&&
Beta::toAB() const {
    return move(Beta_ab(1, 1));
}

最佳答案

Beta_ab&&
Beta::toAB() const {
    return move(Beta_ab(1, 1));
}

这将返回一个悬空引用,就像左值引用案例一样。函数返回后,临时对象将被破坏。您应该按值返回 Beta_ab,如下所示

Beta_ab
Beta::toAB() const {
    return Beta_ab(1, 1);
}

现在,它正在正确地将临时 Beta_ab 对象移动到函数的返回值中。如果编译器可以,它将通过使用 RVO(返回值优化)完全避免移动。现在,您可以执行以下操作

Beta_ab ab = others.toAB();

它会将临时构造移动到 ab 中,或者执行 RVO 以完全省略移动或复制。我推荐你阅读BoostCon09 Rvalue References 101这解释了这个问题,以及 (N)RVO 如何碰巧与此交互。


在其他情况下,您返回右值引用的情况将是一个好主意。想象一下,您有一个 getAB() 函数,您经常在临时调用该函数。让它为右值临时对象返回一个 const 左值引用并不是最佳选择。你可以这样实现它

struct Beta {
  Beta_ab ab;
  Beta_ab const& getAB() const& { return ab; }
  Beta_ab && getAB() && { return move(ab); }
};

请注意,在这种情况下 move 不是可选的,因为 ab 既不是本地自动也不是临时右值。现在,ref-qualifier && 表示第二个函数在右值临时对象上调用,进行以下移动,而不是复制

Beta_ab ab = Beta().getAB();

关于c++ - 通过右值引用返回更有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1116641/

相关文章:

c++ - 通过 Web 请求 C++/Node.js 的 Windows 身份验证

C++11 的采用和兼容性策略?

c++ - 引用与模板模板类折叠

c++ - Qt 4.7.4 QPropertyAnimation 不工作

c++ - Qt 项目中损坏的按位或运算符

c++ - 模板函数名作为模板参数?

c++ - 如何从 std::function 推断返回值类型?

C++0x 模板函数对象推断

c++ - 左值引用和右值引用之间的重载决议

c++ - 运算符可以识别右值吗?