Мой пользовательский класс Integer ниже:
class Integer
{
private:
int * ptr_int_; // Resource
public:
// Other ctors
Integer(Integer &&); // Move constructor
// dtor
}
Конструктор перемещения реализован следующим образом:
Integer::Integer(Integer && arg)
{
std::cout << "Integer(Integer && arg) called\n";
this->ptr_int_ = arg.ptr_int_; // Shallow Copy
arg.ptr_int_ = nullptr;
}
В моем драйвере, для звонка ниже,
Integer obj2{ Integer{5}};
Я ожидал, что будет вызван параметризованный конструктор (для временного объекта), а затем перемещен конструктор. Однако конструктор перемещения не был вызван.
При разборке я получил материал, показанный ниже:
Integer obj2{ Integer{5}};
001E1B04 push 4
001E1B06 lea ecx,[obj2]
001E1B09 call Integer::__autoclassinit2 (01E1320h)
001E1B0E mov dword ptr [ebp-114h],5
001E1B18 lea eax,[ebp-114h]
001E1B1E push eax
001E1B1F lea ecx,[obj2] ;; Is this copy elision(RVO) in action?
001E1B22 call Integer::Integer (01E12FDh)
001E1B27 mov byte ptr [ebp-4],1
Полагаю, это Оптимизация Возвращаемого значения (RVO) в действии.
Я прав?
Поскольку большинство компиляторов реализуют RVO, я не должен делать
Integer obj2{ std::move(Integer{5})};
Должен ли я?