2

C ++は、オブジェクトの数レベルの深さの暗黙的な変換/構築をどのように決定しますか? 例えば:

struct A {};
struct B: A {};
struct C { operator B() { return B(); } };

void f(A a) {}

int main(void)
{
    f(C());
}

可能なすべての変換のツリーを作成し、適切な端末を選択しますか? 他の何か?ありがとう

4

2 に答える 2

4

への呼び出しにf()は 2 つの変換が必要です。1 つはユーザー定義の変換 ( Cto B) で、もう 1 つは組み込みの変換 (built-to-base: Bto A) です。引数が一致しない呼び出しは、0 または 1 つのユーザー定義の変換が必要な場合に成功します。異なる変換 (組み込みまたはユーザー定義) が成功する場合、必要な変換の数/種類がすべての可能な方法で等しい場合、呼び出しはあいまいであり、コンパイラは診断を発行する必要があります。

コンパイラがこれを実装する方法は、標準では指定されていません。

于 2010-03-14T19:51:03.107 に答える
2

標準はこれを指定していません。結果のみを指定します。それぞれのコンパイラ ベンダーは、正しい結果が得られる限り、任意の方法でこれを実装できます。

そのため、おそらくさまざまなアプローチがたくさんあります

于 2010-03-14T19:47:24.787 に答える