デフォルトの関数引数からテンプレートの型パラメータを推定できない理由
C では、コンパイラがテンプレートの型パラメータを推定できるという誤解がよくあります。デフォルトの関数引数から。しかし、これは当てはまりません。
次のコードに遭遇すると、
<code class="cpp">struct foo { template <typename T> void bar(int a, T b = 0.0f) { } }; int main() { foo a; a.bar(5); // Error: could not deduce template argument for T }</code>
コンパイラはデフォルトの引数 0.0f から型 T を推定できません。代わりに、a.bar
C 03 禁止
C 03 では、言語仕様により明示的に使用が禁止されています。テンプレート引数推論のデフォルトの関数引数 (C 03 §14.8.2/17):
A template type-parameter cannot be deduced from the type of a function default argument.
C 11 デフォルトのテンプレート引数
C 11 の回避策出現: デフォルトのテンプレート引数の導入。コードを次のように変更すると、
<code class="cpp">template <typename T = float> void bar(int a, T b = 0.0f) { }</code>
デフォルトのテンプレート パラメーター T が提供されます。ただし、デフォルトのテンプレート引数を指定しても、デフォルトの関数引数の制限が緩和されるわけではないことに注意してください。
C 11 14.8.2.5/5 によれば、デフォルトの関数引数は、デフォルトの関数引数は「非推定コンテキスト」とみなされます。テンプレート引数推定プロセス。これは、コンパイラが関数の引数からのデフォルト値を使用してテンプレート型パラメータを推論できないことを意味します。
結論
デフォルトの関数引数は便利ですが、テンプレート型パラメータはそれらから推測すべきではありません。デフォルト値が必要な場合、デフォルトのテンプレート引数は、より移植性が高く柔軟なソリューションを提供します。
以上がC のデフォルト関数の引数からテンプレート型パラメータを推定できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。