デフォルトの関数引数からのテンプレート引数の推定
C では、プログラマは関数呼び出しからテンプレート引数を推定する必要があるシナリオによく遭遇します。ただし、この推論が失敗し、コンパイラ エラーが発生する場合があります。そのようなケースの 1 つは、デフォルトの関数引数からテンプレート型パラメーターを推定できないことです。
次のコード スニペットを考えてみましょう:
<code class="cpp">struct foo { template <typename T> void bar(int a, T b = 0.0f) { } }; int main() { foo a; a.bar(5); }</code>
このコードをコンパイルすると、コンパイラーは次のようなエラーを生成する可能性があります。 「T のテンプレート引数を推定できませんでした。」この問題を解決するには、関数呼び出しでテンプレート引数 (a.bar
C 03 では、言語仕様により、テンプレート引数を推定するためのデフォルト引数の使用が明示的に禁止されています。 C 03 §14.8.2/17 によると、「テンプレートの型パラメータは、関数のデフォルト引数の型から推測することはできません。」
C 11 では、言語にデフォルトを提供できる新しい機能が導入されました。関数テンプレートのテンプレート引数:
<code class="cpp">template <typename T = float> void bar(int a, T b = 0.0f) { }</code>
ただし、デフォルトのテンプレート引数は必須です。これが指定されていない場合でも、コンパイラはテンプレート引数の推定にデフォルトの関数引数を使用することを禁止します。 C 11 §14.8.2.5/5 には次のように記載されています。
「引数推定が行われている呼び出しで使用されているデフォルト引数を持つ関数パラメータのパラメータ型で使用されるテンプレート パラメータ」は非推論コンテキストです。
要約すると、関数パラメータにデフォルト引数を指定するとコードを簡素化できますが、そのような場合のテンプレート引数推論の制限を理解することが不可欠です。デフォルトの引数は、デフォルトのテンプレート引数が明示的に指定されている場合にのみ、テンプレート引数の推論に使用できます。
以上がC がデフォルトの関数の引数からテンプレート引数を推定できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。