Чтобы проиллюстрировать проблему, давайте рассмотрим эти два простых определения, Bar
— это пользовательский тип с явным конструктором из int:
struct Bar
{
explicit Bar(int a)
{}
};
void f(Bar)
{}
Теперь, как указано в cppreference:
direct-list-initialization (учитываются как явные, так и неявные конструкторы)
Мы можем инициализировать экземпляр таким образом
Bar b1{5};
Тем не менее, вызов функции таким образом является ошибкой компиляции.
f({5});
Это по-прежнему будет наивно выглядеть как прямая инициализация списка аргумента Bar
аргумента f
, плюс можно утверждать, что явное использование фигурных скобок вокруг аргумента делает его... явным.
Какова причина запрета использования явного конструктора для аргументов функций, инициализированных списком?
Редактировать
Связанная страница действительно говорит, что в этой ситуации это не инициализация прямого списка. Тем не менее, в духе вопроса, каково было бы обоснование разработки языковых правил, чтобы в этом случае было copy-list-init , а не direct-list-init ?
f({5})
— это инициализация списка копирования. - person T.C.   schedule 16.12.2016