CTest b = 5;
является точным эквивалентом CTest b(CTest(5));
Участвуют два конструктора: один принимает int
(неявное преобразование из целого числа 5) и конструктор копирования. Оператор присваивания здесь никоим образом не задействован.
Компилятор вполне может оптимизировать ненужную копию, поэтому результат будет таким, как если бы вы набрали CTest b(5)
. Таким образом, во время выполнения допустимым выводом программы будет то, что обе команды видят напечатанный «Конструктор копирования» (GCC с параметром -fno-elide-constructors
) или нет (GCC по умолчанию).
Однако концептуально компилятор должен проверить, существует ли доступный и подходящий конструктор копирования. Форма CTest b = 5;
не сможет скомпилироваться, если а) конструктор копирования является закрытым / защищенным (недоступным) или б) конструктор копирования получает аргумент по неконстантной ссылке (не может принять временное значение из CTest(5)
- VC ++ может принять его как нестандартное расширение компилятора, однако).
Мораль такова: нет простого способа узнать, где и сколько раз вызывается конструктор копирования в программе, глядя на код. Копирование часто может быть опущено, и поэтому вы никогда не должны полагаться на побочные эффекты конструктора копирования. Если он делает то, что должен, то для вас не должно иметь значения, исключает ли компилятор некоторые ненужные вызовы конструктора копирования.