返回rvalue引用vs函数返回类型中的返回值

时间:2015-03-29 17:41:01

标签: c++ rvalue-reference rvalue pass-by-rvalue-reference

在我的代码中,我有一个函数,它从一段数据构造一个字符串,然后返回它。此字符串不会在其他任何地方使用,因此接收方可以安全地使用移动分配或移动初始化。

std::string ReadString(...) {
    ...
    return std::string(...)
}

这基本上就是我所拥有的。 在函数返回类型std :: string&&中是否有任何意义,因为返回的值是一个右值?

std::string&& ReadString(...) {
    ...
    return std::string(...)
}

我担心的是,当我们返回字符串时可能会有一个多余的副本,并且可以通过使返回类型为右值引用来缓解它。

我怀疑编译器也可以针对这些场景进行优化,但是,我不确定。

所以问题是 - 在这种情况下,将返回类型作为右值引用有什么意义吗?为什么?另外,如果没有,那么返回右值引用的函数的可能应用是什么?

感谢。

1 个答案:

答案 0 :(得分:7)

返回对即将销毁的对象的引用总是错误的:引用的对象在以任何形式使用之前都将被销毁。使引用成为右值引用不会改变它,它只是返回一个临时编译。

请注意,按值返回临时字符串可能会导致复制省略,即对象可能会直接在使用它的位置构建。如果没有发生,如果有一个返回类型的移动构造函数(有std::string),则将移动该对象。请注意,返回函数局部变量而不是临时变量时也是如此。