Bjarne Stroustrupは最近、C++の概念にreportを公開しています。 (7.1節)での例では、「速記テンプレート表記」を使用して、本質的にこのように書き:個人的に私には複数のテンプレート引数を持つC++の概念
void foo1(auto x,auto y); // x and y may have different types (1)
void foo2(SomeConcept x,SomeConcept y); // x and y must have the same type (2)
、これは非常に直感的と思われます。実際には、それぞれの型がSomeConceptを満たす限り、foo2が異なる型の値x、yを受け入れることが期待されます。プログラマは常に明示的に次のいずれか書くことによって自分の意図を指定できることに注意してください:直感的に
template <SomeConcept T> void foo2(T x, T y); // (3)
template <SomeConcept T1,SomeConcept T2> void foo2(T1 x,T2 y); // (4)
を、私は(2)から省略表記は、(4)に相当するので、とより一致することを期待します拘束されていないテンプレートの意味(1)。誰かがこの問題について光を当てて、このデザイン決定の背後にある論理的根拠を説明できますか?
いくつかの発言:私の知る限り
- 、(C++ 14で)一般的なラムダは、すでに(1)に似た構文を許可します。したがって、一貫性は、(1)一般的なラムダがそれを行うので、異なるタイプの入力変数を受け入れるべきであると指示する。
- Stroustrupは、このようなテンプレートのコンテキストで古典的な "反復子ペア"を記述しています。しかし、これは非常に弱い議論であると考えています。(i)これはユースケースの1つで、(ii)afaik、C++ 17はジェネリックコードに2つの異なる型を使用させる(イテレータ、センチネル) 。私は現在のコンセプト提案の文脈で簡潔な構文を言及している見つけることができる
それは直観に反すると約束しました。同じコンセプトの異なるタイプが許されている限り、私は本当に*簡略化された構文*を本当に欲しいです。 –
論文は主に作者の意見を代表するものであり、必ずしも委員会の意見ではありません。そして、私は委員会がコンセプトに関して全会一致ではないと思います(あなたは過去の郵送を見ても分かるように)。最終的に何が起こるかはまだ分かりません。あなたが探しているのは、通過した委員会の動きです。 –
コンセプトTS(§8.3.5、p.22)の現行バージョンにも同じルールがあります。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4641 .pdf –