Перемещение вектора, возвращенного из функции (C++)

Подскажите, будет ли перемещен вектор, возвращенный из функции, или произойдет копирование содержимого:

#include <vector>

using std::vector;

struct my_type
{
  int data1;
  int data2;
};

vector<my_type> test_func(int i, int j)
{
  vector<my_type> result {{i, j}, {j, i}};

  return result;
}

int main()
{
  vector<my_type> vec_mt;
  //...
  vec_mt = test_func(1, 2); /* <---- MOVE or COPY ???
  //...
}

Ответы (2 шт):

Автор решения: HolyBlackCat

Копирования точно не будет.

В худшем случае будет перемещен два раза, в лучшем случае - один.

Если написать vector<my_type> vec_mt = test_func(1, 2);, то в худшем случае будет одно перемещение, а в лучшем - ноль.


Сам возврат локальной переменной из функции по значению либо использует NRVO, если компилятор достаточно умный (ноль перемещений), либо перемещение. Источник.

Вот такое присвоение vec_mt = test_func(1, 2); - одно перемещение.

Инициализация vector<my_type> vec_mt = test_func(1, 2); - в C++17 ноль перемещений, из-за обязательного RVO.

→ Ссылка
Автор решения: Andrej Levkovitch

Зависит от используемого стандарда: дело в том, что 11 стандарда был введен copy elision - это означает что при подобном возврате из функции копирования не произойдет. Однако до 17 стандарта там существовали некоторые ограничения на copy elision, например возвращаемую переменную следовало объявлять первой, а иначе содержимое может быть скопировано. С 17-ого эти ограничения были сняты

→ Ссылка