带有默认参数的重载构造函数

Overloaded constructor with default parametars

本文关键字:重载 构造函数 参数 默认      更新时间:2023-10-16

我有两个像这样重载的构造函数,问题是输入了错误的构造函数重载:

class Param
{ 
    Param(
     const std::string& name,
     const MyVariant& variant = MyVariant()
     const std::string& desc = std::string(""),
     bool b1 = true,
     bool b2 = true )
     :
     mName(name),
     mValue(variant),
     mDesc(desc),
     mB1(b1),
     mB2(b2) {}
     Param( 
      const std::string& name,
      const MyVariant& variant,
      bool b1)
      :
      mName(name),
      mValue(variant)
      mB1(b1) {}
   private:
      std::string mName;
      MyVariant mValue;
      std::string mDesc;
      bool mB1;
      bool mB2;
};
 Param p("name",4,"desc"); // this enters the second constructor, not the first why ? 

它使用第二个构造函数,因为"desc"是可以隐式转换为boolconst char*,所以这就是编译器所做的。没有从const char*std::string的隐式转换,因此第一个构造函数在这里甚至不是候选的。

要使用第一个构造函数,你需要显式地传入一个string:

Param p("name",4,std::string("desc"));

编译器倾向于将字符串文字"desc"的类型先转换为const char*,然后再转换为bool,而不是调用std::string的转换构造函数。您可以通过以下操作确保调用第一个构造函数:

Param p("name",4,std::string("desc"));