先说结论
- 在语义层面,潜在的二义性,C++编译器不会报错。
- 只有产生了实际的二义性,C++编译器才报错。
编译器:
- VC6.0
- gcc version 4.8.4
看一段代码:
using namespace std;
void testFunc()
{
cout<<"testFunc void"<<endl;
return;
}
void testFunc(int inputVar = 0)
{
cout<<"testFunc with default input"<<endl;
return;
}
int main()
{
testFunc();
cout<<"here is main func"<<endl;
return 0;
}
会报错:
error C2668: 'testFunc' : ambiguous call to overloaded function
但是,
- 如果把main函数里面的testFunc();删除,则不会报错。
- 因为此时并没有实际的二义性,只是存在潜在的二义性。
扩展:
- 如果一个函数从未被调用,里面有无法链接的符号。Link依然会报错,原因此处不调用,别的地方可能会用到。