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++ の概念について十分に知りません。誰かが私を啓発してくれれば幸いです。