Действительно, 3 раза создается экземпляр Bla
.
Bla GetBla() {
Bla bla; // 1st construction
return std::move(bla); // 2nd construction (return by copy)
}
Не возвращаться на ходу. Просто верните bla
, в большинстве случаев копия будет удалена.
auto bla = std::make_unique<Bla>(GetBla()); // 3rd construction - Bla copy construction
Обратите внимание, что make_unique<Bla>
всегда создает новый экземпляр. В этом случае, поскольку вы передаете другой экземпляр, он становится копируемым.
Намек на то, что происходит копирование, заключается в том, что ваш конструктор по умолчанию вызывается только один раз, а деструктор вызывается 3 раза. Это связано с тем, что в двух других случаях вызывается неявный конструктор копирования (или перемещения) (Bla::Bla(Bla const&)
).