Обе формы выполняют инициализацию . Первый синтаксис (с ()
) называется синтаксисом прямой инициализации. Второй синтаксис (с =
) называется синтаксисом инициализации копирования. Они будут действовать одинаково в большинстве реальных случаев, но между ними действительно есть различия.
В ситуациях, когда типы с левой стороны (LHS) и с правой стороны (RHS) идентичны (без учета любых константных / изменчивых квалификаторов), оба действительно одинаковы. Стандарт языка прямо заявляет, что в этом случае форма =
эквивалентна форме ()
.
Но когда типы различаются (а тип LHS является типом класса), эти две формы обычно работают по-разному.
Форма инициализации копирования работает следующим образом: преобразовать значение RHS во временный объект типа LHS (любым возможным способом: стандартное преобразование, оператор преобразования, конструктор преобразования). А затем используйте конструктор копирования класса LHS для копирования временного объекта в объект LHS.
Форма прямой инициализации работает следующим образом: просто рассмотрите все конструкторы LHS и выберите наиболее подходящий, используя разрешение перегрузки.
Вы можете сразу заметить, что синтаксис инициализации копирования безоговорочно использует конструктор копирования (копирование и промежуточное временное копирование могут быть оптимизированы, но концептуально они есть). Если класс LHS не имеет доступного конструктора копирования, инициализация копирования безусловно становится некорректной, в то время как прямая инициализация все еще может работать.
Кроме того, ключевое слово explicit
, применяемое к определенному конструктору, будет влиять на то, какая форма инициализации доступна для каких комбинаций типов.