意外的行为字符串文字

时间:2014-12-07 09:00:20

标签: c++ qt

我有两种方法:

ind addFilter(ind column, const QString & condition);
ind addFilter(ind column, bool condition);

当我使用这个构造时,gcc选择第二种方法(使用bool condition

filters->addFilter(familyNameInd, "М*");

为什么std::string转换为bool而不是QString?或者我可以在编译时将所有字符串文字指定为QString吗?

3 个答案:

答案 0 :(得分:3)

根据C ++标准(13.3.3.2排名隐式转换序列)

  

2比较隐式转换序列的基本形式(如   在13.3.3.1)中定义 - 标准转换序列(13.3.3.1.1)是   比用户定义的转换序列更好的转换序列   或省略号转换序列,...

相对于您转换为bool的示例,标准隐式转换。所以它比使用转换构造函数的用户定义转换更好。 因此,如果您希望调用类型为const QString &的参数的重载函数,则必须明确指定从字符串文字到QString: QString(“М*”)类型的临时对象的转换。 。

答案 1 :(得分:2)

“M *”是一个const char *,由于隐式转换规则,它可以转换为bool。 将在QString类上选择隐式转换。

你将不得不这样调用这个函数:

filters->addFilter(familyNameInd, QString("М*"));

为避免不必要的QString副本,请考虑使用QStringLiteral宏:

filters->addFilter(familyNameInd, QStringLiteral("М*"));

答案 2 :(得分:1)

首先,您的代码已损坏。没有这样的参数和返回类型ind。我会假设您的意思是int

其次,当涉及隐式转换时,POD类型优先于C ++中的自定义类型。

  

为什么std :: string转换为bool而不是QString?

我不知道为什么你认为它会std::string。它根本就不是,甚至在C ++中也是如此。这是一个很好的旧const char [X],在你的情况下X恰好是三个(两个字母+终止nil)。

  

或者我可以在编译时将所有字符串文字指定为QString吗?

不,但是无论如何在Qt中处理字符串文字时,无论如何都应该使用它:

filters->addFilter(familyNameInd, QStringLiteral("М*"));

对于像这样的原始字符串文字,请使用QString构造函数。这毫无意义。因此,你会写这样的东西:

的main.cpp

#include <QString>
#include <QDebug>

int addFilter(int column, const QString & condition) { qDebug() << "Test 1"; }
int addFilter(int column, bool condition) { qDebug() << "Test 2"; }

int main()
{
    addFilter(0, QStringLiteral("foo"));
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

构建并运行

qmake && make && ./main

输出

Test 1