4

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

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

这基本上就是我所拥有的。由于返回的值是右值,因此使函数返回类型 std::string&& 有什么意义?

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

我担心的是,当我们返回字符串时可能会产生多余的副本,并且可以通过将返回类型设置为右值引用来缓解这种情况。

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

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

谢谢。

4

1 回答 1

9

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

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

于 2015-03-29T17:45:14.857 回答