Из другого комментария: «Поэтому по умолчанию я не должен полагаться на него (поскольку это может зависеть от компилятора)»
Нет, это практически не зависит от компилятора. Любой компилятор, стоящий песчинку, не будет тратить время на создание A, а затем копировать его.
В стандарте прямо говорится, что вполне допустимо, чтобы T = x;
было эквивалентно высказыванию T(x);
. (§12.8.15, стр. 211) Выполнение этого с T(T(x))
явно избыточно, поэтому оно удаляет внутреннее T
.
Чтобы получить желаемое поведение, вы должны заставить компилятор создать по умолчанию первый A:
A a;
// A is now a fully constructed object,
// so it can't call constructors again:
a = A(5);