struct Example
{
Example(const int &i){}
};
Example a=1; // Вызов конструктора
Example b=a; // Вызов копирующего конструктора по умолчанию
Example c=Example(1); // Но что это?
Это вызов конструктора с параметром 1 ИЛИ вызов копирующего конструктора по умолчанию?
Сначала вызов конструктора для создания временного объекта, затем вызов конструктора копирования из временного объекта в тот, что определён слева. Но компилятор может оптимизировать до 1 вызова, если конструктор копирования явно не определён.
Станислав Макаров: если конструктор копирования сделать закрытым или запретить создавать автоматический конструктор копирования, то вариант с присваниванием не сработает.