有全局功能(仅举例):
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
.
归档时间: |
|
查看次数: |
624 次 |
最近记录: |