【问题标题】:Overloaded constructor - constructur with bool argument has precedence重载的构造函数 - 带有 bool 参数的构造函数具有优先权
【发布时间】:2013-02-26 21:24:16
【问题描述】:

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

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

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

Foo foo("blah");

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

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

【问题讨论】:

标签: c++ type-conversion overloading


【解决方案1】:

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

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

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

编辑

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

conversion precedence in c++

【讨论】:

  • 这在规范中的某处吗?
  • @nick 查看附录 B.2
  • 如果你指的是标准,是的,它在 §13.3.3.2,2 中:比较隐式转换序列的基本形式时 [... ] - 标准转换序列 [...] 是比用户定义的转换序列更好的转换序列const char* -> bool 是标准转换序列)
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多