Bjarne Stroustrup のミニペーパー「概念の使用を単純化する」を読んでいたときに、次のスニペット (9 ページ) に出くわしました。
concept ABx<typename T> { void a(T&); void b(T&); }; concept Ax<typename T> { void a(T&); };明らかに、 であるすべての型
ABxは であるAxため、次のようになります。template<Ax T> void f(T); template<ABx T> void f(T t); void h(X x) // X is a type for which a(x) is valid { f(x); // ambiguous }言い換えれば、一般に、
ACxの [sic]a()が と異なることを防ぐ必要がありAxますa()。これら 2 つの が異なる可能性がある場合、上記a()の呼び出しを受け入れることはできません。g(t)a()
この例を理解するのに苦労しています。特に、最後の議論がよくわかりません。
- Bjarne の意味
ABxは ではなくACx? ([sic] をマークした場所) - Bjarneは、それがとが有効な
Xタイプであることを意味しましたか? のみが有効であれば、適用すべきではないと思うので、あいまいさはありません。a(x)b(x)a(x)template<ABx T> void f(T t); a()Bjarne が 2 つの実装が異なる可能性があると主張するとき、彼が何を意味するのかわかりません。それらは同じである必要はありませんか?
Bjarne の例は正しいと確信していますが、私は C++ の概念について十分に知りません。誰かが私を啓発してくれれば幸いです。