Из проекта С++ 11, 7.5 (пункт 1):
Два типа функций с различным языком Связи - это разные типы, даже если они идентичны друг другу.
Таким образом, я могу сделать перегрузку на основе языковых связей:
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)
^
Теперь вопросы:
-
Насколько я понимаю стандарт? Действительно ли этот код действителен?
-
Кто-нибудь знает, если это ошибки в компиляторах, или если они намеренно делают это таким образом для целей совместимости?