Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Почему не вызывается конструктор копирования?

#ооп #cpp


Есть такой класс:
class TFoo {
public:

    TFoo( int a ): a( a ) {
        cout << "Ctor with a = " << a << endl;
    }

    TFoo( const TFoo & ){
        a = 666;
        cout << "Copy ctor" << endl;
    }

private:
    int a;
};

Я пытаюсь создать его экземпляр таким способом:
    TFoo f = TFoo( 2 );

Думаю что должно быть выведено
Ctor with a = 2
Copy ctor
Но вместо этого получаю
Ctor with a = 2

Почему так происходит, ума не приложу.    


Ответы

Ответ 1



По стандарту, компилятор имеет право выбрасывать промежуточный конструктор копирования, даже если он имеет побочные эффекты. Это называется copy elision. Вот обсуждение на StackOverflow со ссылкой на соответствующую часть стандарта. Поэтому, кстати, конструктор копирования должен лишь копировать и не менять данные (ну, может быть, ещё залогировать результат), поскольку он может быть выброшен оптимизатором. Кстати, это единственная оптимизация, которая может «убирать» код с побочными эффектами.

Комментариев нет:

Отправить комментарий