意外行为字符串文本

Unexpected behavior string literal

本文关键字:文本 字符串 意外      更新时间:2023-10-16

我有两种方法:

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

当我使用此结构gcc时,选择第二种方法(带bool condition(

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

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

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

2 在比较隐式转换序列的基本形式时(如 在 13.3.3.1( 中定义( — 标准转换序列 (13.3.3.1.1( 为 比用户定义的转化序列更好的转化序列 或省略号转换序列,以及...

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

"M*" 是一个常量字符*,由于隐式转换规则,它可以转换为布尔值。隐式转换将在 QString 类中选择。

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

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

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

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

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

其次,在隐式转换方面,POD 类型优先于C++自定义类型。

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

我不知道你为什么认为它会std::string.它根本不是,甚至在C++也没有。它是很好的老常量字符[X],其中X恰好是三个(两个字母+终止nil(。

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

不,但是无论这种情况如何,在处理Qt中的字符串文字时,您都应该在任何情况下使用它:

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

对于这样的原始字符串文字,请不要使用 QString 构造器。这是没有意义的。因此,你会写这样的东西:

主.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