1 つの特定の関数に対する複数の関数宣言はすべて、
パラメーターの数と型が同じでなければなりません。また、戻りの型も同じでなければなりません。
これらの戻りの型およびパラメーターの型は、関数型の一部ですが、 デフォルトの引き数と例外指定は、関数型の一部ではありません。
すでになされたオブジェクトまたは関数の宣言が、囲みスコープで可視になっている場合は、 ID には、最初の宣言と同じリンケージが指定されています。ただし、リンケージを持たずに、後でリンケージ指定子を使用して宣言される変数または関数は、 ユーザーが指定したリンケージを持ちます。
引き数のマッチングの観点では、省略符号とリンケージ・キーワードは、関数型の一部と見なされます。 これらは、関数のすべての宣言において、矛盾しないように使用する必要があります。 2 つの宣言におけるパラメーター型で、typedef 名または未指定の引き数配列境界の使用だけが相違している場合、その宣言は同じです。 const または volatile の型指定子も関数型の一部ですが、 宣言の一部、あるいは非静的メンバー関数の定義の一部でしかありません。
2 つの関数宣言が戻りの型とパラメーター・リストの両方で一致する場合、2 番目の宣言が最初の宣言の再宣言として処理されます。 次の例は、同じ関数を宣言します。
int foo(const string &bar); int foo(const string &);
戻りの型が違うだけの 2 つの関数を宣言することは、無効な関数の多重定義となり、 コンパイル時のエラーのフラグが付けられます。次に例を示します。
void f(); int f(); // error, two definitions differ only in // return type int g() { return f(); }
関連参照