[英]Unexpected behavior string literal
我有两种方法:
ind addFilter(ind column, const QString & condition);
ind addFilter(ind column, bool condition);
当我使用这种构造gcc选择第二种方法( bool condition
)
filters->addFilter(familyNameInd, "М*");
为什么将std::string
转换为bool而不是QString? 还是可以在编译时将所有字符串文字指定为QString?
根据C ++标准(13.3.3.2对隐式转换序列进行排名)
2在比较隐式转换序列(如13.3.3.1中定义)的基本形式时-标准转换序列(13.3.3.1.1)比用户定义的转换序列或省略号转换序列更好,并且。 ..
相对于您的示例,转换为bool是标准的隐式转换。 因此,它比使用转换构造函数的用户定义转换更好。 因此,如果要调用参数类型为const QString &
的重载函数,则必须明确指定从字符串文字到QString:
类型的临时对象的转换QString:
QString(“М*”)`。
“ M *”是一个const char *,由于隐式转换规则,它可以转换为bool。 隐式转换将在QString类上选择。
您将必须这样调用该函数:
filters->addFilter(familyNameInd, QString("М*"));
为了避免不必要地复制QString,请考虑同时使用QStringLiteral宏:
filters->addFilter(familyNameInd, QStringLiteral("М*"));
首先,您的代码已损坏。 没有像ind
这样的参数和返回类型。 我认为你的意思是int
。
其次,在隐式转换方面,POD类型优先于C ++中的自定义类型。
为什么将std :: string转换为bool而不是QString?
我不知道您为什么认为它将是std::string
。 事实并非如此,甚至在C ++中也是如此。 这是很好的旧const char [X],在您的情况下X恰好是3(两个字母+终止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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.