c++ - 为什么 const char* 隐式转换为 bool 而不是 std::string?
问题描述
#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
类型? - 隐式转换优先级如何应用在这里?
解决方案
因为 to 的隐式转换const char*
是bool
标准转换,而const char*
tostd::string
是用户定义的转换。前者排名较高,在重载决议中胜出。
标准转换序列始终优于用户定义的转换序列或省略号转换序列。
顺便说一句:mystruct obj(c);
执行直接初始化,也考虑explicit
转换构造函数。mystruct::mystruct(bool)
结果,c
转换为bool
然后mystruct::mystruct(bool)
作为参数传递给构造obj
。
直接初始化比复制初始化更宽松:复制初始化只考虑非显式构造函数和非显式用户定义转换函数,而直接初始化考虑所有构造函数和所有用户定义转换函数。
关于explicit
说明符,
推荐阅读
- node.js - 将数据从节点传递到 React
- fonts - jsPDF中ZaptDingBats和Symbols的映射是什么?
- python - 如何将零添加到一位数(时间)?
- c# - C# VS 2019 SQLException:代码适用于控制台应用程序,但不适用于 WebForms 应用程序
- python-3.x - 无法使用本地文件夹中的模块
- python - Cartopy 上的连续彩色图
- flutter - Flutter:ListView不滚动
- angular - 打印时仅在移动设备上应用 css
- php - 如果域是 X,则禁用站点上的所有链接
- java - Servlet 4.0、JAX-RS 2.1 和 HTTP/2 多路复用