- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在考虑更改一些代码以利用 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/
我一直在考虑更改一些代码以利用 QStringBuilder 其表达式模板 purported performance improvements .不幸的是,这导致我的部分代码开始在某些地方崩溃,示例
我是一名优秀的程序员,十分优秀!