Как я понимаю, само назначение ключевого слова явный запрещает неявное приведение с помощью этого конструктора.
Итак, вы спрашиваете, почему явный конструктор нельзя использовать для неявного преобразования?Очевидно, потому что автор этого конструктора явно отрицал это, используя ключевое слово явный с ним.Цитата из стандарта, который вы опубликовали, просто утверждает, что ключевое слово явное применимо также к спискам инициализаторов (не только к простым значениям некоторого типа).
ADD:
Правильнее сказать: цель ключевого слова явный , используемого с каким-то конструктором, делает абсолютно ясным, что этот конструктор используется в каком-то месте (то есть заставляет весь код вызывать этотконструктор явно).
И оператор IMO, такой как f({a,b})
, когда f
- это имя функции, не имеет ничего общего с явным вызовом конструктора.Совершенно неясно (и зависит от контекста), какой конструктор (и какой тип) используется здесь, например, это зависит от присутствующих перегрузок функций.
С другой стороны, что-то вроде f(SomeType(a,b))
- это совершенно другое - этоСовершенно ясно, что мы используем конструктор типа SomeType
, который принимает два аргумента a,b
, и что мы используем перегрузку функции f
, которая будет наилучшей для принятия одного аргумента типа SomeType
.
Таким образом, некоторые конструкторы в порядке для неявного использования, такие как f({a,b})
, а другие требуют, чтобы факт их использования был абсолютно понятен читателю, поэтому мы объявляем их явным .
ADD2:
Моя точка зрения такова: иногда имеет смысл объявить конструкторы явными, даже если ничто не может пойти не так.ИМО, является ли конструктор явным, является в большей степени вопросом его логики, чем предостережения любого рода.
Например
double x = 2; // looks absolutely natural
std::complex<double> x1 = 3; // also looks absolutely natural
std::complex<double> x2 = { 5, 1 }; // also looks absolutely natural
Но
std::vector< std::set<std::string> > seq1 = 7; // looks like nonsense
std::string str = some_allocator; // also looks stupid