我有两个像这样重载的构造函数,问题是输入了错误的构造函数重载:
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 ?
答案 0 :(得分:4)
它使用第二个构造函数,因为"desc"
是const char*
,可以隐式转换为bool
,这就是编译器的作用。没有从const char*
到std::string
的隐式转换,因此第一个构造函数甚至不是候选者。
要使用第一个构造函数,您需要显式传入string
:
Param p("name",4,std::string("desc"));
答案 1 :(得分:0)
编译器更喜欢将字符串文字的类型"desc"
转换为const char*
,然后转换为bool
,而不是调用std::string
的转换构造函数。您可以通过执行以下操作确保调用第一个构造函数:
Param p("name",4,std::string("desc"));