ホームページ > バックエンド開発 > C++ > C のデフォルト関数の引数からテンプレート型パラメータを推定できないのはなぜですか?

C のデフォルト関数の引数からテンプレート型パラメータを推定できないのはなぜですか?

Linda Hamilton
リリース: 2024-11-05 00:24:02
オリジナル
666 人が閲覧しました

Why Can't Template Type Parameters Be Deduced from Default Function Arguments in C  ?

デフォルトの関数引数からテンプレートの型パラメータを推定できない理由

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(5) のように明示的な指定が必要です。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート