空字符串在构造函数中被解释为bool

Foo*_*Bar 4 c++ qt

我正在研究一个QT项目并发现了一个奇怪的行为:

我有一个类似于几个构造函数的类

DB_Variable(QString name, QString newValue):
name(name),value_string(newValue), var_type(DB_STRING){}

DB_Variable(QString name, bool newValue):
    name(name), value_bool(newValue), var_type(DB_BOOL){}
Run Code Online (Sandbox Code Playgroud)

我现在想使用第一个构造函数来创建一个这样的对象:

DB_Variable foo("some_name"," ");
Run Code Online (Sandbox Code Playgroud)

我希望将空字符串解释为QString,但调用第二个(bool)构造函数.有人可以告诉我为什么吗?是""指向空字符串的指针,然后某种程度上是bool而不是字符串?

shu*_*e87 6

此问题是由构造函数中的隐式转换引起的.字符串文字(例如代码中的字符串文字)存储为const char类型.因为您没有采用此类型的构造函数,所以编译器会尝试查找转换为可在其中一个构造函数中找到的类型.

在这种情况下const char*转换为bool更容易,QString所以当你这样做时:

DB_Variable foo("some_name"," ");
Run Code Online (Sandbox Code Playgroud)

构造函数

DB_Variable(QString name, bool newValue):
Run Code Online (Sandbox Code Playgroud)

叫做.

请注意,您看到的行为并不是因为" "得到的处理方式与任何其他字符串文字不同,只是您很可能没有带有类型的构造函数bool, bool(所有构造函数都QString将第一个参数作为第一个参数?).如果您有一个如下构造函数,则可能是:

DB_Variable(bool test1, bool newValue):
Run Code Online (Sandbox Code Playgroud)

那么当你做了类似的事情时,就会调用它 DB_Variable foo("some_name"," ");

要获得您想要的结果,您可以这样传递QStrings:

DB_Variable foo(QString("some_name"), QString());
Run Code Online (Sandbox Code Playgroud)

或者也许定义一个const char*第二个参数的构造函数.