架空の、以前はC ++ 0xの概念に関する質問
-
05-07-2019 - |
質問
(前文:私はC ++ 0xゲームの追随者であり、C ++ 0x標準から概念を削除することに関する最近の論争は、C ++ 0x標準についての詳細を学ぶ動機になりました。私の質問はすべて完全に仮説に基づいていることを理解していますが、概念が今後しばらくの間有効なC ++コードにならない限り、特にそれがどのように役立つかを考えると、概念についてさらに学ぶことに興味があります私は最近の決定の背後にあるメリットとその後の論争をより完全に理解しています)
C ++ 0x(最近まで)が提案した概念に関する入門資料を読んだ後、いくつかの構文上の問題に頭を悩ませています。これ以上苦労することなく、ここに私の質問があります:
1)特定の派生コンセプトをサポートするタイプ(暗黙的に、autoキーワードを介して、またはconcept_mapsを介して明示的に)も、ベースコンセプトをサポートする必要がありますか?言い換えれば、概念を別の概念(たとえばconcept B<typename T> : A<T>
)から派生させる行為には、暗黙のうちに 'invisible' requireステートメント(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と一致しますか?または、typenamesを含む概念にconcept_mapは必要ですか?
3)最後に、どの公理が定義を許可されるかを理解するのに苦労しています。たとえば、論理的に一貫性のない公理を定義する概念を持つことができますか?
concept SomeConcept<typename T>
{
T operator*(T&, int);
axiom Inconsistency(T a)
{
a * 1 == a * 2;
}
}
それは何をしますか?それも有効ですか?
これは非常に長い一連の質問であることを感謝します。よろしくお願いします。
解決
最新のC ++ 0xドラフト N2914 (概念にまだ言葉遣いが残っています)を次の回答のリファレンスとして使用してください。
1)概念は、その点でインターフェースに似ています。タイプがコンセプトをサポートする場合、すべての<!> quot; base <!> quot;もサポートする必要があります。コンセプト。あなたが引用するウィキペディアの声明は、型のクライアントの観点から理にかなっています-彼がT
が概念Derived<T>
を満たすことを知っているなら、彼はそれが概念Base<T>
を満たすことも知っています。タイプオーサーの観点から、これは当然、両方を実装する必要があることを意味します。 14.10.3 / 2を参照してください。
2)はい、typename
メンバーを持つ概念はauto
にできます。このようなメンバーは、同じ概念の関数メンバーの定義で使用されている場合、自動的に推測できます。たとえば、イテレータのvalue_type
は、そのoperator*
の戻り型として推定できます。ただし、型メンバーがどこでも使用されていない場合、それは推定されないため、暗黙的に定義されません。あなたの例では、SomeType<T>::Type
またはDummy
のいずれかに対してDummy1
を推定する方法はありません。これは、Type
がコンセプトの他のメンバーによって使用されていないため、どちらのクラスもコンセプトにマップされないためです(実際、 、どのクラスも自動マッピングできませんでした)。 14.10.1.2/11および14.10.2.2/4を参照してください。
3)公理は仕様の弱点であり、常に(より)理にかなっているように常に更新されていました。ドラフトから概念が引き出される直前に、かなり変わった論文-それを読んで、あなたにとってもっと意味があるか、それとも疑問があるかどうかを確認してください。
特定の例(構文の違いを考慮)では、<!> quot; as-ifの目的で、式(a*1)
が(a*2)
と同じであると見なすことがコンパイラーに許可されることを意味します<!> quot;言語の規則(つまり、結果が何も存在しないかのように 動作する限り、コンパイラは必要な最適化を行うことを許可されます)。ただし、コンパイラーは公理の正確さを検証するために必要なわけではありません(そのため公理と呼ばれる理由です!)-コンパイラーはそれが何であるかを取得します。