Как избежать копирования?
В обоих случаях вызываются два конструктора, однако вы не видите его в первом случае, поскольку один из них является сгенерированным компилятором. Если вы хотите избежать копирования, вам нужно использовать другой синтаксис, такой как:
A<bool> a(true);
A<bool> a(3.5f);
Почему (и какой) конструктор копирования называется?
A<bool> a = A<bool>(true);
Здесь конструктор A (bool val) используется для создания временного значения, в то время как конструктор копирования, сгенерированный компилятором по умолчанию, используется для копирования A в A. Вы копируете тот же тип, а для конструктора копирования того же типа используемый. Интересный и неочевидный факт: Конструктор шаблона никогда не используется в качестве конструктора копирования, даже если он выглядит как один.
A<bool> a = A<float>(3.5f);
Здесь конструктор A<float>(float val)
используется сначала для создания временного значения, а затем для выполнения копирования используется шаблонный конструктор A<bool>( A<float> val)
.