gpt4 book ai didi

c++ - 如何防止 QStringBuilder 超出其初始化范围

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:05 25 4
gpt4 key购买 nike

我一直在考虑更改一些代码以利用 QStringBuilder 其表达式模板 purported performance improvements .不幸的是,这导致我的部分代码开始在某些地方崩溃,示例如下:

#define QT_USE_QSTRINGBUILDER
#include <numeric>
#include <vector>
#include <QString>
#include <QStringBuilder>

int main()
{
std::vector<int> vals = {0, 1, 2, 3, 4};
QString text = "Values: " + QString::number(vals[0]);
text = std::accumulate(vals.begin() + 1, vals.end(), text, [](const QString& s, int i)
{
return s + ", " + QString::number(i);
});
}

崩溃的原因是 lambda 表达式的返回类型被推断为 QStringBuilder<QStringBuilder<QString,const char [3]>,QString>在返回后尝试转换为 QString分配给 accumulate结果。此转换崩溃,因为它试图使用对 lambda 范围内且现已被销毁的对象的引用。可以通过显式指定 lambda 的返回类型来修复此崩溃 [](const QString& s, int i) -> QString这确保在退出闭包之前进行转换。

然而,启用 QStringBuilder 的事实这里导致以前工作的代码崩溃,甚至没有发出警告意味着我现在将避免在其他地方使用它,除非我能保证这种情况不会再次发生。由于在这种情况下 RVO 可以阻止任何复制的发生,我认为禁用对象复制的常用技术不会起作用。有没有办法防止这种情况发生在 QStringBuilder 中?或类似的表达式模板,或者维护对自动变量的引用的对象是否总是使用不安全?

最佳答案

lambda 应该返回一个显式类型:

[]() -> Type { }

or

[]() -> QString { }

关于c++ - 如何防止 QStringBuilder 超出其初始化范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32476634/

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