我对以下代码感到好奇,有人可以解释为什么它首先调用bool func? isn`t“str”更适合arg类型的字符串吗?
void a(bool input)
{
cout<<"I amd first"<<endl;
cout<<input<<endl;
}
void a(const string &input)
{
cout<<"I amd second"<<endl;
cout<<input<<endl;
}
int main( )
{
a("str"); // call void a(bool input)
a(string("str")); //call void a(const string &input)
return 0;
}
答案 0 :(得分:3)
"str"
属于const char[4]
类型,会立即衰减到const char *
,而任何指针类型转换为bool
都会被视为之前自定义类型的非显式构造函数。
所以,我会说答案是“因为标准是这样说的”。
相关段落应为13.3.3.2¶2:
比较隐式转换序列的基本形式(如13.3.3.1中所定义)
- 标准转换序列(13.3.3.1.1)是比用户定义的转换序列或省略号转换序列更好的转换序列[...]
答案 1 :(得分:1)
我猜这是因为当你调用(“str”)时,你试图用参数const char *调用一个函数。它会在任何其他隐式转换(:: std :: string etc)之前将任何类型的指针转换为bool。