C++ Primer上说,
struct B; struct A{ A()=default; A(const B&); }; struct B{ operator A() const; } A f(const A&); B b; A a=f(b);//二义性错误 A a1=f(b.operator A());//正确 A a2=f(A(b));//正确
我们无法使用强制类型转换来解决二义性问题,因为强制类型转换本身也面临二义性,这句话到底是什么意思啊?这不是通过强制类型转换实现了功能吗?
闭关修行中......
この文は正確には何を意味しますか?
この文は次のことを意味します: (f(b) を呼び出すときにあいまいさがあります) このあいまいさは、強制型変換 (f(static_cast<A>(b)) または f((A)b)) を使用しても排除できません。元の文は次のとおりです:
f(b)
f(static_cast<A>(b))
f((A)b)
キャストを使用しても曖昧さは解決できないことに注意してください。キャスト自体にも同じ曖昧さがあります。
この関数は強制型変換で実装されているのではないでしょうか?
いいえ、例の 2 つの正しい呼び出しはどちらもキャストを使用していません。最初の呼び出しでは、B の変換関数を明示的に呼び出すことによって曖昧性が除去され、2 番目の呼び出しでは、B の変換関数を明示的に呼び出すことによって曖昧さが除去されます。
簡単に言うと、キャスト自体が実行可能な変換シーケンスを必要とするため、ここでキャスト型変換を使用しても呼び出しのあいまいさを取り除くことはできませんが、2 つは変換コンストラクターと変換関数を通じてそれぞれ取得できます。両者の間に優劣(?)はありません。
関係ありません: しかし、ここに本当にあいまいさがあるかどうかは疑わしいようです。
これは、C++ が変換を強制する方法を指定していないことを意味します。C++ は A のコンストラクターまたは B のオーバーロードのいずれかを選択できます。どちらを選択するか、どのように実装するかは IDE 自体によって決定されます。 IDE のバージョンが異なれば、実装も異なります。
この文は次のことを意味します: (
f(b)
を呼び出すときにあいまいさがあります) このあいまいさは、強制型変換 (f(static_cast<A>(b))
またはf((A)b)
) を使用しても排除できません。元の文は次のとおりです:いいえ、例の 2 つの正しい呼び出しはどちらもキャストを使用していません。最初の呼び出しでは、B の変換関数を明示的に呼び出すことによって曖昧性が除去され、2 番目の呼び出しでは、B の変換関数を明示的に呼び出すことによって曖昧さが除去されます。
簡単に言うと、キャスト自体が実行可能な変換シーケンスを必要とするため、ここでキャスト型変換を使用しても呼び出しのあいまいさを取り除くことはできませんが、2 つは変換コンストラクターと変換関数を通じてそれぞれ取得できます。両者の間に優劣(?)はありません。
関係ありません:
しかし、ここに本当にあいまいさがあるかどうかは疑わしいようです。
これは、C++ が変換を強制する方法を指定していないことを意味します。C++ は A のコンストラクターまたは B のオーバーロードのいずれかを選択できます。どちらを選択するか、どのように実装するかは IDE 自体によって決定されます。 IDE のバージョンが異なれば、実装も異なります。