我有两种方法:
ind addFilter(ind column, const QString & condition);
ind addFilter(ind column, bool condition);
当我使用这个构造时,gcc选择第二种方法(使用bool condition
)
filters->addFilter(familyNameInd, "М*");
为什么std::string
转换为bool而不是QString?或者我可以在编译时将所有字符串文字指定为QString吗?
答案 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
构造函数。这毫无意义。因此,你会写这样的东西:
#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;
}
TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
qmake && make && ./main
Test 1