Конструкторы - не единственный способ создания объекта.A Copy Constructor
и Move Constructor
(C ++ 11 и далее) могут делать то же самое.
В вашем случае, когда выполняется return ex
, экземпляр, созданный в функции, удаляется, и новый экземплярсоздается с помощью Copy Constructor
.вы получите распечатку, если напишите следующий код
Example(const Example &) {
std::cout << "Copy Constructor" << std::hex << this << std::endl;
}
Копирование произойдет до уничтожения исходного объекта, и, следовательно, вы увидите эту распечатку перед деструктором.
Почему этого не происходитв некоторых компиляторах?
Из-за механизма, называемого RVO (оптимизация возвращаемого значения), компилятор понимает, что вы будете использовать один и тот же экземпляр, и поэтому он перемещается, а не копируется.
Надеюсь, что это проясняет.