C ++は、オブジェクトの数レベルの深さの暗黙的な変換/構築をどのように決定しますか? 例えば:
struct A {};
struct B: A {};
struct C { operator B() { return B(); } };
void f(A a) {}
int main(void)
{
f(C());
}
可能なすべての変換のツリーを作成し、適切な端末を選択しますか? 他の何か?ありがとう
C ++は、オブジェクトの数レベルの深さの暗黙的な変換/構築をどのように決定しますか? 例えば:
struct A {};
struct B: A {};
struct C { operator B() { return B(); } };
void f(A a) {}
int main(void)
{
f(C());
}
可能なすべての変換のツリーを作成し、適切な端末を選択しますか? 他の何か?ありがとう
への呼び出しにf()
は 2 つの変換が必要です。1 つはユーザー定義の変換 ( C
to B
) で、もう 1 つは組み込みの変換 (built-to-base: B
to A
) です。引数が一致しない呼び出しは、0 または 1 つのユーザー定義の変換が必要な場合に成功します。異なる変換 (組み込みまたはユーザー定義) が成功する場合、必要な変換の数/種類がすべての可能な方法で等しい場合、呼び出しはあいまいであり、コンパイラは診断を発行する必要があります。
コンパイラがこれを実装する方法は、標準では指定されていません。
標準はこれを指定していません。結果のみを指定します。それぞれのコンパイラ ベンダーは、正しい結果が得られる限り、任意の方法でこれを実装できます。
そのため、おそらくさまざまなアプローチがたくさんあります