有全局功能(仅举例):
void func( int i )
{
std::cout << i + 100 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我假设用char参数调用这个函数没有任何意义所以我使用delete:
void func(char) = delete;
Run Code Online (Sandbox Code Playgroud)
所以我希望以下呼叫应该是可能的:
func(1);
func(3.1);
func(true);
Run Code Online (Sandbox Code Playgroud)
并且使用char参数调用应该是forbiden:
func('a');
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.打电话时,func('a')我按预期得到:
error: use of deleted function ‘void func(char)’
Run Code Online (Sandbox Code Playgroud)
但在打电话给func(2.3)我的时候:
error: call of overloaded ‘func(double)’ is ambiguous
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误?没有删除带有char参数的函数,double被转换为int并调用了func(int),为什么现在它被禁止?
vso*_*tco 12
你打电话的时候
func(2.3)
Run Code Online (Sandbox Code Playgroud)
你传递double给函数.候选人列表中包含两个 func(int)和func(char),因为重载解决方案在 delete开始之前发生:
如果函数过载,则首先发生重载解析,如果选择了删除的函数,则程序只会 格式错误Ref:cppreference.com,请参阅Avishai对精确标准引号的回答.
现在double可以转换为char和int,因此模棱两可.
没有删除带有char参数的函数,double被转换为int并调用了func(int),为什么现在它被禁止?
你得到的多义性错误,即使没有delete荷兰国际集团的char版本,看住这里.当然,如果你只定义了func(int),那么就没有歧义,所以很double乐意将它转换为int.