gpt4 book ai didi

c++ - 使用声明为 `static const` 的 QRegExp 对象是否安全?

转载 作者:行者123 更新时间:2023-11-27 22:35:59 25 4
gpt4 key购买 nike

我试图稍微优化我的代码,发现我对 QRegExp 的使用不涉及它的任何非常量方法:

我的代码:

QString parse(const QString &data) {
static const QRegExp DATA_REGEXP(QStringLiteral("^(\\w{4}) (\\w{4}) SN=(\\w*)"));

if (DATA_REGEXP.indexIn(data) != -1) {
const QString vendorId = DATA_REGEXP.cap(1);
const QString modelId = DATA_REGEXP.cap(2);
const QString serial = DATA_REGEXP.cap(3);

// ...
}

// ...
}

我想知道这怎么可能(有 const - 实际改变对象的方法),查看了 the code并发现即使这些方法被声明为const,它们在内部操作可变(不要与mutable关键字混淆)私有(private)对象(Qt使用PIMPL惯用语)。所以现在我想知道在这个 static const QRegExp 对象上调用 indexIncap 是否安全?这些方法似乎不可重入,因为它们在多个线程中的使用会导致更改共享内存,所以我想我必须使用同步原语,对吗?

最佳答案

在这种特殊情况下 doc fo indexIn()状态:

Although const, this function sets matchedLength(), capturedTexts() and pos().

很明显,这意味着 indexIn() 不应该是常量。

除此特殊情况外,Qt 类确实将 const 传播到它们的私有(private)指针。

在您的情况下,我建议使用 QRegularExpression,因为进行匹配不会修改正则表达式的状态,但会返回一个 QRegularExpressionMatch 对象。

再次引用Qt documentation :

The QRegularExpression class introduced in Qt 5 is a big improvement upon QRegExp, in terms of APIs offered, supported pattern syntax and speed of execution. The biggest difference is that QRegularExpression simply holds a regular expression, and it's not modified when a match is requested. Instead, a QRegularExpressionMatch object is returned, in order to check the result of a match and extract the captured substring. The same applies with global matching and QRegularExpressionMatchIterator.

Other differences are outlined below.

关于c++ - 使用声明为 `static const` 的 QRegExp 对象是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54106012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com