C++11 ドラフト 7.5 (para. 1) から:
言語リンケージが異なる 2 つの関数型は、それ以外は同一であっても、別個の型です。
したがって、言語リンケージに基づいてオーバーロードを実行できます。
extern "C" typedef void (*c_function)();
typedef void (*cpp_function)();
void call_fun(c_function f)
{
}
void call_fun(cpp_function f)
{
}
extern "C" void my_c()
{
}
void my_cpp()
{
}
int main()
{
call_fun(my_c);
call_fun(my_cpp);
}
ただし、GCC 4.7.1 では、このサンプル コードでエラー メッセージが表示されます。
test.cpp: In function 'void call_fun(cpp_function)':
test.cpp:7:6: error: redefinition of 'void call_fun(cpp_function)'
test.cpp:4:6: error: 'void call_fun(c_function)' previously defined here
そして CLang++ で:
test.cpp:7:6: error: redefinition of 'call_fun'
void call_fun(cpp_function f)
^
test.cpp:4:6: note: previous definition is here
void call_fun(c_function f)
^
今質問:
標準に対する私の理解は正しいですか?このコードは有効ですか?
これらがコンパイラのバグなのか、それとも互換性のために意図的にそうしているのか、誰か知っていますか?