#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
построить темп vector
с move(data)
а затем назначить временную vector
в v
?
Нет больше деталей, чтобы добавить …
В вашем маленьком тестовом случае, скорее всего, нет никакой разницы. Дополнительный временный объект почти наверняка будет удален. И v
в main будет содержать содержимое переменной-члена.
Но в общем случае:
Версия 1 будет определенно покинуть член data
в каком-то неопределенном «пустом» состоянии. Даже когда возвращаемое значение функции отбрасывается.
Версия 2 может оставьте элемент в каком-либо неопределенном пустом состоянии, иначе это может быть не так. Например, если функция вызывается и ее возвращаемое значение отбрасывается, элемент не изменится. Вот почему можно сказать, что std::move
само по себе ничего не двигает.
Других решений пока нет …