Задать вопрос
@yatanai
Поклонник православного С

Почему множественный вызов конструктора создаёт только один объект?

Почему при написание кода типа
#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, но этого не происходит
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Средний 4 комментария
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Прочитайте про избавление от копирования, которое сделали обязательной функциональностью Си+17.
https://en.cppreference.com/w/cpp/language/copy_elision
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы