С [dcl.init]:
В противном случае (т.е., для остальных случаев копирования инициализации), определяемого пользователя последовательность преобразования , которые могут преобразовать от типа источника к типу назначения или (когда используется функция преобразования ), к ее производному классу перечислены, как описано в 13.3.1.4, а лучшим является , выбранным с помощью разрешения перегрузки (13.3).
Мы можем вызвать определенное пользователем преобразование, которое от типа источника непосредственно к целевому типу. То есть, если бы у нас было Bar(float)
, мы рассмотрели бы этот конструктор. Однако в этом случае наш кандидат просто Bar(Foo)
, который не принимает float
.
Вам разрешено ноль или одно пользовательское преобразование. В случае с прямой инициализацией мы просто вызываем Bar(Foo)
, который вызывает одно пользовательское преобразование (float --> Foo
). В случае инициализации копии мы ищем последовательность преобразований от float
(тип источника) вплоть до Bar
(тип назначения), которая включает в себя две пользовательских конверсий (float --> Foo
, Foo --> Bar
), следовательно, ошибка.
Попробуйте изменить 'Bar (Foo foo)' to 'Bar (const Foo & foo)' –
@RemyLebeau Почему вы думаете, что он будет работать (это не так)? –