首页 > 解决方案 > 为什么 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
  1. 为什么const char*隐式转换为bool而不是std::string,尽管构造函数需要explicit类型?
  2. 隐式转换优先级如何应用在这里?

标签: c++implicit-conversionoverload-resolutionexplicitconstructor-overloading

解决方案


因为 to 的隐式转换const char*bool标准转换,而const char*tostd::string是用户定义的转换。前者排名较高,在重载决议中胜出。

标准转换序列始终优于用户定义的转换序列或省略号转换序列。

顺便说一句:mystruct obj(c);执行直接初始化,也考虑explicit转换构造函数。mystruct::mystruct(bool)结果,c转换为bool然后mystruct::mystruct(bool)作为参数传递给构造obj

直接初始化比复制初始化更宽松:复制初始化只考虑非显式构造函数和非显式用户定义转换函数,而直接初始化考虑所有构造函数和所有用户定义转换函数。

关于explicit说明符

  1. 指定构造函数or conversion function (since C++11) or deduction guide (since C++17)是显式的,也就是说,它不能用于隐式转换复制初始化

推荐阅读