以下のコードを検討してください。
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
ユーザー定義の変換演算子 toがあります。ただし、 の最後の行では、 に変換されてから に渡されると予想していました。ただし、削除されたコンストラクターのみが考慮されます。このコンストラクターの方が適していることは理解していますが、オーバーロード セットに も含まれていないのはなぜですか? また、コンパイラーが暗黙的な変換を実行しないのはなぜですか?Foo
Bar&
main
Foo f1
Bar
Foo(const Bar&)
Foo(const Foo&) = delete;
Foo(const Bar&)