繁体   English   中英

意外的行为字符串文字

[英]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构造器。 这是没有意义的。 因此,您将编写如下内容:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM