戻り値の型は関数のシグネチャに影響しますか?
C では、関数テンプレートなしで宣言された関数は、そのシグネチャで戻り値の型を除外します。戻り値の型の違いのみに基づいて関数をオーバーロードすることは禁止されています。
詳細な説明
関数、その宣言、および署名間の関係は複雑です。
宣言と実体
関数宣言関数エンティティまたはテンプレート エンティティを宣言できます。通常の関数と関数テンプレートの明示的な特殊化は、最初のカテゴリに属します。プライマリ関数テンプレートまたは引数が指定されていない明示的な特殊化は、後者のカテゴリに分類されます。
署名定義
C 標準 (1.3.10) によると、関数署名には次のものが含まれます。以下:
ただし、この定義には戻り値の型についての言及がありません。
関数テンプレートと戻り値の型
逆に、関数テンプレートの特殊化のシグネチャには両方が含まれます。関数のシグネチャと戻り値の型 (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 サイトの他の関連記事を参照してください。