Почему при написание кода типа
#include <iostream>
using namespace std;
struct Foo
{
Foo() noexcept { wcout << L"ctor default\n"; }
Foo(const Foo& a_f) noexcept { wcout << L"ctor copy\n"; }
Foo( Foo&& a_f) noexcept { wcout << L"ctor move\n"; }
~Foo() noexcept { wcout << L"dtor\n"; }
Foo& operator=( Foo&& a_f) noexcept { wcout << "assign move\n"; return *this; }
Foo& operator=(const Foo& a_f) noexcept { wcout << "assign copy\n"; return *this; }
};
void main()
{
Foo x{ Foo(Foo{}) };
}
//Вывод: ctor default
//Вывод: dtor
Я наблюдаю только конструктор для объекта "х" без создания временных объектов Foo? Почему происходит такая оптимизация, где за это почитать, отключается ли и можно ли как-то на этом спотыкнуться?
UPD: Я ожидаю что в выводе будет несколько вызовов ctor move и один ctor default, но этого не происходит