成员函数return成员变量的右值引用
Member function return rvalue reference of member variable
#include <vector>
using namespace std;
struct TempData {
vector<int> data;
TempData() {
for(int i = 0; i < 100; i++) data.push_back(i);
}
// vector<int> GetData() { // function 1
// return move(data);
// }
vector<int>&& GetData() { // function 2
return move(data);
}
};
int main() {
vector<int> v;
{
TempData td;
v = td.GetData();
}
}
function 1
和function 2
有什么区别?
会不会function 1
用move(data)
构造一个临时vector
,然后将临时vector
分配给v
?
没有更多详细信息要添加...
在您的小测试用例中,可能没有区别。额外的临时对象几乎肯定会被删除。而main中的v
会保存成员变量的内容。
但一般情况下:
版本 1 肯定会 使成员 data
处于某种未指定的 "empty" 状态。即使函数 return 值被丢弃。
版本 2 可能 使成员处于某种未指定的空状态,也可能不会。例如,如果调用函数并丢弃其 return 值,则成员将保持不变。这就是为什么可以说 std::move
本身不会移动任何东西。
#include <vector>
using namespace std;
struct TempData {
vector<int> data;
TempData() {
for(int i = 0; i < 100; i++) data.push_back(i);
}
// vector<int> GetData() { // function 1
// return move(data);
// }
vector<int>&& GetData() { // function 2
return move(data);
}
};
int main() {
vector<int> v;
{
TempData td;
v = td.GetData();
}
}
function 1
和function 2
有什么区别?
会不会function 1
用move(data)
构造一个临时vector
,然后将临时vector
分配给v
?
没有更多详细信息要添加...
在您的小测试用例中,可能没有区别。额外的临时对象几乎肯定会被删除。而main中的v
会保存成员变量的内容。
但一般情况下:
版本 1 肯定会 使成员 data
处于某种未指定的 "empty" 状态。即使函数 return 值被丢弃。
版本 2 可能 使成员处于某种未指定的空状态,也可能不会。例如,如果调用函数并丢弃其 return 值,则成员将保持不变。这就是为什么可以说 std::move
本身不会移动任何东西。