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

时间:2014-06-25 14:16:48

标签: 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){}

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

DB_Variable foo("some_name"," ");

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

Foo

3 个答案:

答案 0 :(得分:6)

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

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

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*作为第二个参数。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

  

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

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

我对Qt不是很熟悉,但如果QString的构造函数(带有char [N]或char *参数)是显式的,那么在编写时只会使用第一个构造函数:< / p>

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)