std::initializer_list 崩溃问题

luchengbiao 2018-12-26 11:40:02
发现使用std::initializer_list<QString>时,会造成程序崩溃,貌似是堆栈破坏,猜测和QString的数据隐式共享机制有关,但具体原因还未定位,测试代码如下,期待解答:

#include "qstring_initializer_list_test.h"
#include <QtWidgets/QApplication>
#include <vector>
#include <QString>
#include <QStringList>

#define LK_TEACHING_MODE "teaching_mode"
#define LK_VS_MODE "vs_mode"

static QString s_teaching("teaching mode");
static QString s_vs("vs mode");

static QString QStringOfKey(const std::string& key)
{
return key == LK_TEACHING_MODE ? QString("teaching mode") : QString("vs mode");
}

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

{
//std::initializer_list<QString> container = { s_teaching, s_vs }; // 没问题
//std::initializer_list<QString> container = { QString("teaching mode"), QString("vs mode") }; // 没问题

std::initializer_list<QString> container = { QStringOfKey(LK_TEACHING_MODE), QStringOfKey(LK_VS_MODE) }; // 会崩溃!!!!!!!!!!!!!!

// 没问题
//std::vector<QString> container;
//container.emplace_back(QStringOfKey(LK_TEACHING_MODE));
//container.emplace_back(QStringOfKey(LK_VS_MODE));

// 没问题
//QStringList container;
//container.push_back(QStringOfKey(LK_TEACHING_MODE));
//container.push_back(QStringOfKey(LK_VS_MODE));
}

QString_initializer_list_Test w;
w.show();
return a.exec();
}


...全文
89 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧