12

(プリアンブル:私は C++0x ゲームに遅れて従い、C++0x 標準からの概念の削除に関する最近の論争がきっかけで、それらについてもっと学ぶようになりました。私の質問はすべて完全に仮説 -- 概念が有効な C++ コードであるとしても、しばらくの間有効ではない限り -- 概念についてもっと学ぶことにまだ興味があります。特に、最近の決定の背後にあるメリットをより完全に理解するのにどのように役立つかを考えると、その後の論争)

C++0x (最近まで) が提案した概念に関する入門資料を読んだ後、いくつかの構文上の問題に頭を悩ませています。これ以上苦労することなく、ここに私の質問があります:

1) 特定の派生概念をサポートする型 (auto キーワードを介して暗黙的に、または concept_maps を介して明示的に) も、基本概念を個別にサポートする必要がありますか? 言い換えれば、概念を別の概念から導出する行為 (例: concept B<typename T> : A<T>) には、(B, 内に) '見えない' 要求ステートメントが暗黙的に含まれていrequires A<T>;ますか? 混乱は、概念に関するウィキペディアのページに次のように記載されていることから生じます。

クラス継承と同様に、派生概念の要件を満たす型は、基本概念の要件も満たします。

つまり、型は派生概念の要件を満たす必要があるだけであり、必ずしも基本概念の要件を満たす必要はないと言っているように思えますが、これは私には意味がありません。ウィキペディアが決定的な情報源ではないことは理解しています。上記の説明は言葉の選択が悪いだけですか?

2) タイプ名をリストする概念は「自動」にすることができますか? もしそうなら、コンパイラはこれらの型名をどのように自動的にマップしますか? そうでない場合、概念で「自動」を使用することが無効になる他の機会はありますか?

明確にするために、次の架空のコードを検討してください。

template<typename Type>
class Dummy {};

class Dummy2 { public: typedef int Type; };

auto concept SomeType<typename T>
{
     typename Type;
}

template<typename T> requires SomeType<T>
void function(T t)
{}

int main()
{
    function(Dummy<int>()); //would this match SomeType?
    function(Dummy2()); //how about this?
    return 0;
}

これらのクラスのいずれかが SomeType と一致しますか? それとも、型名を含む概念に concept_map が必要ですか?

3) 最後に、どの公理が定義できるのか理解に苦しむ。たとえば、次のような論理的に矛盾する公理を概念に定義させることはできますか?

concept SomeConcept<typename T>
{
    T operator*(T&, int);

    axiom Inconsistency(T a)
    {
         a * 1 == a * 2;
    }
} 

それは何をしますか?それも有効ですか?

これは非常に長い一連の質問であることを理解しています。事前に感謝します。

4

1 に答える 1

11

次の回答のリファレンスとして、最新の C++0x ドラフトであるN2914 (まだ概念の文言が含まれています) を使用しました。

1) 概念はその中でインターフェースのようなものです。型が概念をサポートしている場合は、すべての「基本」概念もサポートする必要があります。Tあなたが引用するウィキペディアの声明は、型のクライアントの観点からは理にかなっていDerived<T>ますBase<T>。型作成者の観点からは、これは当然、両方を実装する必要があることを意味します。14.10.3/2 を参照してください。

typename2) はい、メンバーを持つコンセプトはauto. そのようなメンバーは、同じ概念内の関数メンバーの定義で使用されている場合、自動的に推測できます。たとえば、value_typefor iterator は、その の戻り値の型として推測できますoperator*。ただし、型メンバーがどこにも使用されていない場合、それは推定されないため、暗黙的に定義されません。あなたの例では、コンセプトの他のメンバーによって使用されていないため、またはSomeType<T>::Typeのいずれかを推測する方法がないため、どちらのクラスもコンセプトにマップされません(実際、どのクラスもそれに自動マップできません)。14.10.1.2/11 および 14.10.2.2/4 を参照してください。DummyDummy1Type

3) 公理は仕様の弱点であり、ある程度 (より) 意味のあるものにするために常に更新されていました。コンセプトがドラフトから引き出される直前に、かなり変更された論文がありました。それを読んで、それが自分にとってより意味があるかどうか、またはまだ疑問があるかどうかを確認してください。

あなたの特定の例(構文の違いを説明する)については、言語の「 (a*1)as (a*2)-if」ルール(つまり、コンパイラーは結果が最適化されていないのように動作する限り)。ただし、コンパイラは、公理の正しさを検証する必要はまったくありません (したがって、公理と呼ばれる理由です!)。

于 2009-07-29T20:28:25.837 に答える