【发布时间】:2017-07-14 18:49:33
【问题描述】:
我最近在Is returning by rvalue reference more efficient? 看到了这个问题,也注意到了 cmets 链。我正在跟进 cmets 链以获得那里的答案。
人们似乎说,在下面的情况下,返回值应该是右值引用而不是值。 (Is returning by rvalue reference more efficient? 和 Is there any case where a return of a RValue Reference (&&) is useful?)给出以下代码
#include <iostream>
using namespace std;
class Something {
public:
Something() {
cout << "Something()" << endl;
}
Something(const Something&) {
cout << "Something(const Something&)" << endl;
}
Something(Something&&) {
cout << "Something(Something&&)" << endl;
}
};
class Maker {
public:
Something get_something() && {
return std::move(this->something);
}
const Something& get_something() & {
return this->something;
}
private:
Something something;
};
int main() {
auto maker = Maker{};
auto something_one = maker.get_something();
auto something_two = Maker{}.get_something();
return 0;
}
用右值引用返回类型和常规值定义类Maker 中的第一个方法有什么区别?运行上面的代码会按预期给我以下输出(移动发生在函数调用中,返回后移动被省略)
Something()
Something(const Something&)
Something()
Something(Something&&)
当我更改代码(即Maker 类中的第一个方法)以返回右值引用时,我仍然得到相同的输出。在这种情况下,为什么我不应该按值返回?
【问题讨论】:
-
目前还不清楚这里有什么问题。为什么你认为在这种情况下你不应该按值返回?
-
@NicolBolas 更新了问题。我想知道为什么人们似乎说这是通过右值引用返回的一个很好的用例。我正在努力寻找通过右值引用返回的好用例..
-
我在这些问题中看到没有人说它“应该”在那里使用。只是它可以这样使用。这完全取决于你想要做什么。
-
@NicolBolas 是否有任何用例无法通过按值返回更好地服务?
-
另一张海报是正确的;与我最初使用的相比,它更像是 Return value or rvalue reference 的副本。
标签: c++ c++11 return-value rvalue return-value-optimization