Стандарт C ++ 14 ( N4296 ) гласит в 8.5 / 17.6.1
Если инициализация является прямой инициализацией [...], рассматриваются конструкторы. Применимые конструкторы перечислены, и лучшие
один выбирается через разрешение перегрузки. [...] Если нет конструктора
применяется, или разрешение перегрузки неоднозначно, инициализация неверна.
Поэтому при прямой инициализации рассматриваются только конструкторы - функции преобразования игнорируются. В следующем коде нет применимого конструктора A
, только функция преобразования из B
. Тем не менее, код компилируется, почему?
struct A{};
struct B{
operator A(){ return A{}; }
};
int main() {
B b;
A a(b); // direct-initialization
}