ホームページ >バックエンド開発 >C++ >C 関数のオーバーロードでは戻り値の型の違いのみが許容されますか?

C 関数のオーバーロードでは戻り値の型の違いのみが許容されますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-11 19:21:15919ブラウズ

Does C   Function Overloading Allow Differences Only in Return Type?

戻り値の型は関数シグネチャに含まれていますか?また戻り値の型の変更のみによるオーバーロードは許可されていますか?

C では区別があります関数宣言と関数エンティティの間。宣言では、関数エンティティまたはテンプレート エンティティを確立できます。非テンプレート関数宣言の場合、署名には引数の型、クラス メンバーシップ情報 (該当する場合)、および修飾子が含まれます。ただし、関数テンプレートの特殊化の場合、シグネチャには戻り値の型も含まれます。

関数の特殊化の関数シグネチャ

標準 C では、関数テンプレートの特殊化の場合、シグネチャには次のことが規定されています。セクション14.5.5.1で強調表示されている戻り値の型。これには、テンプレートの署名と提供されたテンプレート引数が含まれます。これは、戻り値の型が関数の型に影響するという理解と一致しています。

区別された戻り値の型によるオーバーロード

標準によれば、関数宣言は次のようになります。さまざまな戻り値の型は、オーバーロードの観点から区別されるものとみなされます (セクション 13.1)。ただし、「戻り値の型によってのみ異なる」という定義は、言語では未指定のままです。

コンパイラーの動作

現在、主要なコンパイラーは、同一のシグネチャを持つが異なる関数宣言を拒否します。戻り値の型 (例: "int f();"、"double f();")。ただし、この動作は必ずしも標準によって義務付けられているわけではありません。

C 0x ドラフト提案

最近の C 0x ドラフト仕様では、「署名」のより包括的な定義が提供されています。セクション 1.3.11 には、関数エンティティとテンプレート特殊化の両方の戻り値の型が明示的に含まれています。これは、戻り値の型が関数の型の不可欠な部分を形成するという主張と一致します。

したがって、要約すると次のようになります。

  • 関数の特殊化には、シグネチャに戻り値の型が含まれます。
  • 非テンプレート関数のシグネチャには戻り値の型がありません。
  • オーバーロード戻り値の型の違いのみを持つことは標準に基づいて禁止されていますが、この条件の正確な解釈はコンパイラや言語のバージョンによって異なる場合があります。

以上がC 関数のオーバーロードでは戻り値の型の違いのみが許容されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。