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

Empty string is interpreted as bool in Constructor

本文关键字:解释 bool 字符串 构造函数      更新时间:2023-10-16

我正在做一个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){}

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

DB_Variable foo("some_name"," ");

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

Foo

这个问题是由于在构造函数中进行隐式转换造成的。字符串字面值(例如代码中的字面值)存储为const char类型。因为没有采用此类型的构造函数,所以编译器会尝试在构造函数中找到可以找到的类型的转换。

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

DB_Variable foo("some_name"," ");

构造函数

DB_Variable(QString name, bool newValue):

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

DB_Variable(bool test1, bool newValue):

那么当您执行诸如DB_Variable foo("some_name"," ");

之类的操作时,将会调用此函数。

要得到你想要的结果,你可以像这样传入QStrings:

DB_Variable foo(QString("some_name"), QString());

或者定义一个构造函数,将const char*作为第二个形参

字符串" "只是一个char*。与使用用户定义的转换到QString相比,它更容易转换到bool

我希望空字符串被解释为QString,但是调用了第二个(bool)构造函数。有人能告诉我为什么吗?

" "char[2]衰减到char*,然后作为指针转换为int型,作为int型转换为bool型。

我不是很熟悉Qt,但如果QString的构造函数(需要一个char[N]或char*参数)是显式的,那么当您编写时,您将只参与第一个构造函数:

DB_Variable foo("some_name", QString{ " " });
                   // HERE:  ^^^^^^^^     ^

最简单的解决方案是向DB_Variable类添加第三个构造函数。您可以通过多种方式做到这一点,但是如果您希望将一个空值(默认情况下)设置为" ",则应该编写类似于以下的代码:

DB_Variable(QString name):
name(name),value_string(" "), var_type(DB_STRING){}
客户机代码:

DB_Variable foo("some_name"); // create variable with empty value (actually " " value)