Ответ 1
Я не могу объяснить причины этого, но я могу повторить очевидное.
Я нашел это удивительным. Это действительно намерение С++ 11 что этот код не компилируется?
§13.3.1.7
В инициализации списка копий, если выбран явный конструктор, инициализация плохо сформирована.
Удаление = исправляет его:
Foo foo { 42 };
, но я лично считаю это труднее объяснить людям, которые привыкли к форме с = для так как стандарт относится к "brace-or-equal-initializer" не очевидно, почему старый добрый путь не работает в этом сценарии.
Foo foo { 42 }
прямая инициализация, тогда как знак равенства (с фигурными скобками) делает его копия-лист инициализация. Другой ответ объясняет, что из-за сбоя компиляции для copy-initialization (знак равенства без фигурных скобок), то не удивительно, что он также терпит неудачу для копирования -list-initialization, но два отказа по разным причинам.
cppreference:
Прямая инициализация более разрешима, чем инициализация копирования: copy-initialization рассматривает только неявные конструкторы и пользовательские функции преобразования, в то время как прямая инициализация рассматривает все конструкторы и неявные последовательности преобразований.
И их страница в явный спецификатор:
Задает конструкторы и (поскольку С++ 11) конверсия операторы, которые не допускают неявных преобразований или копирования инициализации.
С другой стороны, для инициализации списка копий:
T object = {arg1, arg2,...}; (10)
10) в правой части знака равенства (аналогично инициализации копирования)
В противном случае конструкторы T рассматриваются в двух фазах:
- Если предыдущий этап не дает соответствия, все конструкторы T участвуют в разрешении перегрузки по множеству аргументов, которые состоит из элементов списка бит-init, с ограничением что допускаются только не суживающиеся преобразования. Если этот этап создает явный конструктор как наилучшее совпадение для copy-list-initialization, компиляция не выполняется (обратите внимание, в простой copy-initialization, явные конструкторы вообще не рассматриваются)
Как обсуждалось в Что может пойти не так, если инициализация списка копий разрешила явные конструкторы?, компиляция завершилась неудачно, потому что явный конструктор выбран, но не разрешен б.