6

我最近遇到了一个像下面这样的类

class Foo {
public:
    Foo(std::string msg) {}
private:
    Foo(bool b) {}
};

我注意到尝试通过以下方式创建此类的对象

Foo foo("blah");

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

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

4

1 回答 1

7

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

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

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

编辑

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

c++中的转换优先级

于 2013-03-11T16:00:14.277 回答