ホームページ >バックエンド開発 >C++ >C 関数のシグネチャには戻り値の型が含まれますか?

C 関数のシグネチャには戻り値の型が含まれますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-04 05:02:10695ブラウズ

Does C   Function Signature Include the Return Type?

戻り値の型は関数のシグネチャに影響しますか?

C では、関数テンプレートなしで宣言された関数は、そのシグネチャで戻り値の型を除外します。戻り値の型の違いのみに基づいて関数をオーバーロードすることは禁止されています。

詳細な説明

関数、その宣言、および署名間の関係は複雑です。

宣言と実体

関数宣言関数エンティティまたはテンプレート エンティティを宣言できます。通常の関数と関数テンプレートの明示的な特殊化は、最初のカテゴリに属します。プライマリ関数テンプレートまたは引数が指定されていない明示的な特殊化は、後者のカテゴリに分類されます。

署名定義

C 標準 (1.3.10) によると、関数署名には次のものが含まれます。以下:

  • パラメータtypes
  • クラス メンバーの場合、関数およびそれを含むクラスの cv 修飾子

ただし、この定義には戻り値の型についての言及がありません。

関数テンプレートと戻り値の型

逆に、関数テンプレートの特殊化のシグネチャには両方が含まれます。関数のシグネチャと戻り値の型 (14.5.5.1)。

では、シグネチャの正確な構成要素は何でしょうか?

非テンプレート関数の場合、シグネチャは戻り値の型を除外します。 。ただし、テンプレートの特殊化では、戻り値の型が組み込まれます。

オーバーロードの影響

標準では、異なる戻り値の型のみに基づいたオーバーロードを禁止しています。ただし、そのような区別を構成するものについてはあいまいなままです。

コンパイラの動作

主要なコンパイラは、型に互換性がないため、次のコードを拒否します:

int f();
double f(); // invalid

しかし、彼らはaccept:

template<typename T> int f();
template<typename T> double f(); // invalid?

結論

戻り値の型は、非テンプレート関数の署名の一部ではありませんが、関数の型の互換性を判断する上で重要です。これらのニュアンスを理解することは、効果的な C プログラミングにとって不可欠です。

以上がC 関数のシグネチャには戻り値の型が含まれますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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