在使用Visual C++ 2017(带有/std:c++14
或/std:c++17
选项)时,以下代码可以正常工作:
void TakePtr(char*); // const or not
int main()
{
TakePtr(char{});
TakePtr(char());
}
我不明白它为什么有效。
显然,以下方法也可以工作(如预期):
void TakeChar(char);
TakeChar(char{});
TakeChar(char());
当使用 char{}
或 char()
作为参数时,编译器如何推断(或转换)类型 char
为 char*
呢?现在,如果我同时拥有
char
和 char*
两种重载,它可以正常工作而不会出现任何关于歧义的错误/警告:void TakePtr(char*);
void TakePtr(char);
TakePtr(char{}); // Chooses 'char'
TakePtr(char()); // Chooses 'char'
为什么编译器对于 TakePtr(char*)
中的 char{}
是可以接受的?
为什么它没有在选择更好的版本时给出警告/错误?这种行为必定会破坏现有的代码。当然,编译器对以下内容并不满意:
void TakePtr(char*);
char c{};
TakePtr(c);
char()
构造一个临时的(char)0
,可以转换为任何可接受空指针的整数0
。我在 godbolt 上测试过,我相信我是正确的:Compiler Explorer。 - Scheff's Catxor ecx,ecx; call void TakePtr(char *)
。 - Evgvoid TakePtr(char) = delete;
可能可以抑制不良行为。 - EljayTakePtr(char{8})
失败了,而TakePtr(char{0})
没有。 - Ajay