変換演算子とコンストラクターに関するSOに関するいくつかの質問をここで読んだことで、それらの間の相互作用、つまり「あいまいな」呼び出しがある場合について考えるようになりました。次のコードを検討してください。
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
B b = A(); //what should be called here? apparently, A::operator B()
return 0;
}
上記のコードは「Aの変換演算子と呼ばれる」を表示します。これは、コンストラクターではなく変換演算子が呼び出されることを意味します。operator B()
からコードを削除/コメントアウトするA
と、コンパイラは代わりにコンストラクタを使用するように切り替えます(コードに他の変更はありません)。
私の質問は次のとおりです。
- コンパイラーは
B b = A();
あいまいな呼び出しとは見なさないため、ここでは何らかの優先順位が機能している必要があります。この優先順位はどこで正確に確立されていますか?(C ++標準からの参照/引用をいただければ幸いです) - オブジェクト指向の哲学的観点から、これはコードの動作方法ですか?オブジェクトがどのようにオブジェクトに
A
なるべきかについて、誰がもっと知っていますか?C ++によると、答えは次のとおりです。オブジェクト指向の実践で、これが当てはまるはずだと示唆するものはありますか?個人的にはどちらにしても意味があるので、どうやって選んだのか知りたいです。B
A
B
A
前もって感謝します