Я пытался протестировать небольшой код, чтобы проверить, выполняет ли мой компилятор (в Visual Studio 2019) копирование elision, поскольку в некоторых случаях это не является обязательным для C ++ 17.
Поэтому я попытался код ниже:
#include <iostream>
#include <vector>
using namespace std;
struct myStruct
{
myStruct() { cout << "default ctor" << endl; }
myStruct(const myStruct& str) { cout << "copy ctor" << endl; }
myStruct& operator=(myStruct other) { cout << "Copy assignement" << endl; return *this; }
myStruct(myStruct&& str) noexcept { cout << "move ctor" << endl; }
myStruct& operator=(myStruct&& other) { cout << "move assignement" << endl; return *this; }
~myStruct() { cout << "deleted" << endl; }
};
myStruct get()
{
myStruct s;
return s;
}
int main()
{
vector<myStruct> vect;
vect.reserve(10);
cout << "Creating The Vector" << endl;
vect.push_back(get());
vect.push_back(get());
cout << "Cretion End" << endl;
return 0;
}
Итак, насколько я прочитал, вызов функции get () вызовет RVO, поэтому я получу только вызовы ctor. Но когда я запускаю программу, я получаю (я добавил <<<< перед строками, которые связаны с копированием после вызова функции get ()): </p>
Creating The Vector
default ctor
move ctor
deleted
move ctor <<<<
deleted <<<<
default ctor
move ctor
deleted
move ctor <<<<
deleted <<<<
Cretion End
deleted
deleted
При попытке с помощью g cc я получаю :
Creating The Vector
default ctor
move ctor
deleted
default ctor
move ctor
deleted
Cretion End
deleted
deleted
Похоже, что Microsoft до сих пор не реализовала Elision Copy, или в моем коде есть ошибка, поэтому я упустил реальную прелесть Copy elision?
Заранее спасибо