重载的构造函数 - 具有bool参数的constructur具有优先权

sym*_*nic 6 c++ overloading type-conversion

我最近遇到了类似以下的课程

class Foo {
public:
    Foo(std::string msg) {}
private:
    Foo(bool b) {}
};
Run Code Online (Sandbox Code Playgroud)

我注意到试图通过创建这个类的对象

Foo foo("blah");
Run Code Online (Sandbox Code Playgroud)

导致编译错误,告知它Foo::Foo(bool)是私有的.显然,如果参数不是实际的std :: string,编译器更喜欢将构造函数与bool参数一起使用.另一方面,如果没有给出私有构造函数,上面的代码编译就好了.

为什么"-constructor bool"优先于string"-constructor"althogh传递的参数的类型不适合它们中的任何一个?这只是一个定义的问题,还是有更深层次的意义和一些好理由?

Jar*_*Par 7

原因与转换运算符优先级有关.每个调用都包含一个隐式转换

  1. 指针 - > std::string
  2. 指针 - > bool

在这种情况下,#1是用户定义的转换,#2是语言/编译器定义的转换.用户定义的转换具有低得多的优先级,因此优选其他转换.

编辑

这是一个类似的问题,它对所涉及的优先检查有更深入的解释

c ++中的转换优先级

  • @nick在附录B.2中查看 (2认同)