4

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()

この例を理解するのに苦労しています。特に、最後の議論がよくわかりません。

  1. Bjarne の意味ABxは ではなくACx? ([sic] をマークした場所)
  2. Bjarneは、それがとが有効なXタイプであることを意味しましたか? のみが有効であれば、適用すべきではないと思うので、あいまいさはありません。a(x)b(x)a(x)template<ABx T> void f(T t);
  3. a()Bjarne が 2 つの実装が異なる可能性があると主張するとき、彼が何を意味するのかわかりません。それらは同じである必要はありませんか?

Bjarne の例は正しいと確信していますが、私は C++ の概念について十分に知りません。誰かが私を啓発してくれれば幸いです。

4

0 に答える 0