Рассмотрим код ниже:
struct Bar{};
struct Foo
{
Foo() = default;
Foo(const Bar&) {}
Foo(const Foo&) = delete;
// IMPLICIT conversion to Bar
operator Bar(){return {};}
};
int main()
{
Foo f1;
Foo f2(static_cast<Bar>(f1)); // this is OK
Foo f3(f1); // does not compile, why not implicit conversion to `Bar`?
}
Класс Bar
имеет определяемый пользователем оператор преобразования в Foo
, который принимает Bar&
s. Однако в последней строке main
я ожидал, что Foo f1
будет преобразовано в Bar
, а затем передано в Foo(const Bar&)
. Однако рассматривается только удаленный конструктор Foo(const Foo&) = delete;
. Я понимаю, что этот конструктор лучше подходит, но почему Foo(const Bar&)
также не входит в набор перегрузки и почему компилятор не выполняет неявное преобразование?