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

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

DDD
リリース: 2024-11-05 09:14:02
オリジナル
994 人が閲覧しました

Why Can't C   Deduce Template Arguments from Default Function Arguments?

デフォルトの関数引数からのテンプレート引数の推定

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(5) など) を明示的に指定する必要があります。しかし、そもそもなぜコンパイラは型の推定に失敗するのでしょうか?

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

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