C では、デフォルトのテンプレート引数はクラス テンプレートでのみ許可され、関数テンプレートでは許可されません。この制限は意外に思えるかもしれませんが、その背後にはいくつかの理由があります。
デフォルトのテンプレート引数により、クラス テンプレートは特定のパラメーターにデフォルト値を提供できます。これは、テンプレートのほとんどのインスタンスでデフォルト値が変更される可能性が低い場合に便利です。たとえば、並べ替えアルゴリズムのクラス テンプレートには、並べ替えに使用される比較関数のデフォルトのテンプレート引数を含めることができます。
ただし、関数に対してデフォルトのテンプレート引数は許可されません。テンプレートを使用すると曖昧さが生じるためです。次の仮定の例を考えてみましょう:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
この例では、T が mymember 関数のデフォルトの型であるか、my_class テンプレート自体のデフォルトの型であるかは不明です。このあいまいさにより、コード内で微妙なエラーが発生する可能性があります。
C 11 より前は、関数テンプレートのデフォルト テンプレート引数の禁止が重大な制限でした。ただし、C 11 では、型のエイリアスを定義できる「型エイリアス」と呼ばれる新機能が導入されました。これにより、関数テンプレートのデフォルトのテンプレート引数がない場合の回避策が提供されます。たとえば、上記の例は次のように書き換えることができます。
<code class="cpp">struct my_class { typedef int default_type; template<class T = default_type> void mymember(T* vec) { // ... } };</code>
型エイリアスはデフォルトのテンプレート引数ほど便利ではありませんが、同様の機能を提供し、現在の C 標準の制限を克服できます。 .
C の元の設計者である Bjarne Stroustrup は、欠陥レポートの中で、関数テンプレートのデフォルトのテンプレート引数の禁止についての見解を表明しました。
関数テンプレートのデフォルトのテンプレート引数の禁止は、独立した関数が二級市民として扱われ、すべてのテンプレート引数が指定されるのではなく関数の引数から推定されることを要求していた時代の誤った名残です。
以上がデフォルトのテンプレート引数が C のクラス テンプレートに制限されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。