Значение инициализации статически размещенного объекта - PullRequest
4 голосов
/ 23 января 2020

У меня есть такой класс:

class Car {
    int x;
public:
    Car() {cout << "Init car" << endl;}
    Car(const Car & c) { cout << "Copy car" << endl;}
    Car(const Car && c) { cout << "Move car" << endl;}
};

Когда я хочу инициализировать значение объекта класса Car:

Car c = Car();

Вызывается только конструктор по умолчанию. Почему не вызывается copy construcotr или конструктор перемещения, поскольку существует присваивание?

1 Ответ

5 голосов
/ 23 января 2020

Из-за copy elision , который гарантирован из C ++ 17.

При следующих обстоятельствах компиляторы обязаны опустить копирование и перенести конструкцию класса объекты, даже если конструктор копирования / перемещения и деструктор имеют видимые побочные эффекты. Объекты создаются непосредственно в хранилище, где они в противном случае были бы скопированы / перемещены. Конструкторы копирования / перемещения не обязательно должны присутствовать или быть доступными:

  • При инициализации объекта, когда выражение инициализатора является prvalue того же типа класса (игнорируя квалификацию cv) как тип переменной:

    T f() {
        return T();
    }
    
    T x = T(T(f())); // only one call to default constructor of T, to initialize x
    

PS: T x = T(); не присваивание, а инициализация, точнее, копирование инициализации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...