T x{v};
- инициализировал переменную x типа T со значением v. T x = {v};
- то же самое, потому что = здесь просто необязательно.
Что касается N3291 (последний рабочий проект перед окончательным стандартом), они не одинаковы для всех возможных v
и T
.
Принципиальное отличие заключается в следующем.Первый - это явный вызов конструктора, и поэтому он может выбрать конструктор, объявленный explicit
.Вторым является , а не явный вызов конструктора (даже если он будет вызывать конструктор).Поэтому он не может выбрать explicit
конструкторов.
Из 13.3.1.7:
При инициализации копирования списка все функции-кандидаты являются конструкторамиT. Однако, если выбран явный конструктор, инициализация является некорректной.
Цель этого состоит в том, чтобы гарантировать, что вы не сможете случайно выполнить преобразование explicit
значения при использовании копирования.инициализация, даже с синтаксисом {}
.