#include <iostream>
#include <string>
struct mystruct{
mystruct(std::string s){
std::cout<<__FUNCTION__ <<" String "<<s;
}
explicit mystruct(bool s) {
std::cout<<__FUNCTION__<<" Bool "<<s;
}
};
int main()
{
const char* c ="hello";
mystruct obj(c);
return 0;
}
输出:mystruct Bool 1
const char*
隐式转换为 bool
而不是 std::string
,虽然构造函数需要 explicit
类型 ? 最佳答案
因为来自 const char*
的隐式转换至 bool
被限定为标准转换,而 const char*
至 std::string
是用户定义的转换。前者排名更高,在overload resolution中获胜。 .
A standard conversion sequence is always better than a user-defined conversion sequence or an ellipsis conversion sequence.
顺便说一句:
mystruct obj(c);
执行 direct initialization , explicit
转换构造函数,包括 mystruct::mystruct(bool)
也被考虑。结果,c
转换为 bool
然后传递给 mystruct::mystruct(bool)
作为构造 obj
的参数.Direct-initialization is more permissive than copy-initialization: copy-initialization only considers non-explicit constructors and non-explicit user-defined conversion functions, while direct-initialization considers all constructors and all user-defined conversion functions.
关于
explicit
specifier ,
- Specifies that a constructor
or conversion function (since C++11)
or deduction guide (since C++17)
is explicit, that is, it cannot be used for implicit conversions and copy-initialization.
关于c++ - 为什么 const char* 隐式转换为 bool 而不是 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66452781/