删除重载功能.C++ 11.超载的召唤......含糊不清

Ada*_*iak 8 c++ c++11

有全局功能(仅举例):

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可以转换为charint,因此模棱两可.

没有删除带有char参数的函数,double被转换为int并调用了func(int),为什么现在它被禁止?

你得到的多义性错误,即使没有delete荷兰国际集团的char版本,看住这里.当然,如果你只定义了func(int),那么就没有歧义,所以很double乐意将它转换为int.