Во-первых, это прямая инициализация, а во-вторых, копирование инициализации.
Прямая инициализация означает, что объект инициализируется с использованием одного (возможно, преобразования) конструктора и эквивалентен форме T t(u);
:
U u;
T t1(u); // calls T::T( U& ) or similar
Инициализация копирования означает, что объект инициализируется с помощью конструктора копирования после первого вызова пользовательского преобразования, если это необходимо, и эквивалентен форме T t = u;
:
T t2 = t1; // same type: calls T::T( T& ) or similar
T t3 = u; // different type: calls T::T( T(u) )
// or T::T( u.operator T() ) or similar
Копировать Инициализация не работает, если объявлен конструктор explicit
.
Ссылки
Эта запись в GOTW Херба Саттера должна быть хорошо прочитана.
Чтобы ответить на ваш отредактированный вопрос:
=
имеет различное значение в зависимости от того, как оно используется.
Если =
используется в выражении, в котором объект создается и инициализируется одновременно, то =
рассматривается не как оператор присваивания, а как инициализация копирования.
Если =
используется для назначения одного объекта другому, после того, как объект был создан, это приводит к вызову оператора присваивания.