从C++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)
^
现在有以下问题:
我对标准的理解正确吗?这段代码是有效的吗?
任何人知道这些编译器中的错误是故意为了兼容性而这样做的,还是说它们只是单纯的bug?