Missing reference in range-for with non trivial type (QString) 警告

原始代码如下,

QStringList fileList = QFileDialog::getOpenFileNames(this, title, curPath, filter);
for (QString i : fileList)
{ui->plainTextEdit->appendPlainText(i);
}

根据IDE语法建议修改成如下代码,警告消失,

for (const QString &i : fileList)
{ui->plainTextEdit->appendPlainText(i);
}

感觉重点在引用上面,于是将const去掉,果然还是正确的,

for (QString &i : fileList)
{ui->plainTextEdit->appendPlainText(i);
}
  • 那么为什么需要在范围循环语句(range-for)中让遍历元素使用引用呢?

  • 首先,non trivial type 是“有意义类型”的意思,即显式提供了构造函数或存在虚函数、虚基类等情况,总之non trivial在进行拷贝时比trivial要慢。

  • 很明显,QString就属于non trivial type。

  • 当我们在使用范围循环语句(range-for)遍历容器时,如果不使用引用(QString i : fileList),会导致每次遍历容器中对象都会进行一次值拷贝,这种值拷贝对于开销non trivial type尤为明显,并且如果需要在遍历过程中修改容器元素的值,那么很显然值拷贝做不到。

  • 使用引用(QString &i)来遍历容器,即使用变量别名访问容器中元素,既可以避免值拷贝的无意义开销也可以直接操作到容器中的元素。当不需要修改容器中元素时,使用(const QString &i)更为合理。

  • 总结:

范围循环语句(range-for)中使用引用可以避免无意义的开销
当需要修改容器中元素,应当使用引用


trivial与non-trivial

trivial的大致意思就是:无关痛痒

1.构造函数: ctor

2.拷贝构造函数: copy

3.赋值运算符重载: assigment

4.析构函数: dtor

基本内置类型的这四种函数都是trivial类型的,自定义类型的类就有点模糊了! 不过呢,总结出来符合下面几个条件的就是 non-trivial函数

1.显示的定义了这四种函数.

2,类中有非静态非POD的数据成员.

3.拥有带有虚函数的基类.

而POD的意思就是Plain Old Data,也就是C++的内建类型或传统的C结构体类型. POD类型必然有trivial ctor/copy/dtor/assignemnt函数.


参考:
https://www.zhihu.com/question/438300953

https://blog.csdn.net/a627088424/article/details/48595525

https://stackoverflow.com/questions/3899223/what-is-a-non-trivial-constructor-in-c

https://blog.csdn.net/qq_37253168/article/details/121982291

https://blog.csdn.net/Dawn_sf/article/details/78881221

【Qt】警告Missing reference in range-for with non trivial type相关推荐

  1. C++ for循环警告:Missing reference in range-for with non trivial type (QString)

    在qtcreator 中写了一个for循环,提示警告:Missing reference in range-for with non trivial type (QString) 如下图: 代码如下: ...

  2. 样式表(05):【纲】Qt Style Sheets Reference [官翻]

    文章目录 定制样式的小部件列表 属性列表 图标列表 属性类型列表 伪状态列表 子控件列表 Qt Style Sheets Reference Qt样式表支持各种属性.伪状态和子控件,使得定制小部件的外 ...

  3. 编译时出现警告missing return statement at end of non-void function

    编译时出现警告missing return statement at end of non-void function 解决办法 解决办法 1.首先检测程序逻辑,有没有可能出现一些情况会导致程序没有返 ...

  4. leetcode报错:reference binding to misaligned address 0xbebebebebebec0ba for type ‘int‘, which requir 4

    leetcode,剑指offer 31题报错: Line 170: Char 16: runtime error: reference binding to misaligned address 0x ...

  5. Qt Creator老是提示红色信息In included file:unknown type name ‘b‘,怎么解决?

    1.问题描述 如题,Qt Creator老是提示红色信息In included file:unknown type name 'b',怎么解决? 2.解决方法 其实这些提示信息,不会影响源码的编译,但 ...

  6. 【Qt】undefined reference to `vtable for xxx’

    00. 目录 文章目录 00. 目录 01. 问题描述 02. 问题分析 03. 问题解决 04. 预留 05. 附录 01. 问题描述 编译Qt项目的时候,出现undefined reference ...

  7. Qt下Undefined reference to 'vtable for xxx'

    QT下遇到这种错误提示时候需要注意以下情况: 一.cpp文件里使用了Q_OBJECT 分析:qmake不会处理.cpp文件里的Q_OBJECT,所以如果在.cpp文件中有它的话将会产生undefine ...

  8. QT出现“undefined reference to `vtable for’”解决方法

    Qt 中新建类时,若需要使用信号与槽机制,必须显式启用Q_OBJECT宏.利用QT IDE添加并创建新的类时,在编译过程中会出现以下报错: undefined reference to `vtable ...

  9. 单片机声明数组可变长度c语言keil,单片机用byte定义数组keil编译警告 missing';'before...

    警告如下: missing';'before sz 单片机源码如下: #include #include "intrins.h" int x; sbit d6=P2^6; sbit ...

  10. Qt警告提示:找不到“stddef.h”头文件,操蛋得很~~~

    RT,Qt提示找不到"stddef.h"头文件,操蛋得很~~~ [root@fedora workspace]# find / -name stddef.h /usr/includ ...

最新文章

  1. 调度框架学习笔记(3)—— 集群调度框架的架构演进过程
  2. Python设计模式-单例模式
  3. Xamarin.Forms的ActivityIndicator和ProgressBar比较
  4. 作为软件设计师的2013年终总结
  5. 唤起你对c#曾经的记忆
  6. It was in 2006, and as a desktop computer
  7. 【转】ZooKeeper学习第二期--Zookeeper命令操作
  8. HTK语音识别基础教程.ppt
  9. win7 计算机定时关机脚本,win7定时关机命令是什么 如何设置定时关机【图解】...
  10. OpenGL采样贴图显示不出来
  11. 微信公众号运营都有哪些渠道,来提升公众号的粉丝量
  12. MS4200 PCI串口卡驱动
  13. 郭天祥的10天学会51单片机_第五节
  14. poi导出Excel,表格画斜线,并设置数据
  15. OV426+OVM6946基于FPGA调试成像
  16. HTTP协议 (五) ---代理
  17. IEEE认证Pdf格式失败问题
  18. 扫地机器人的构造及核心技术详解
  19. JavaScript parseInt和parseFloat用法
  20. 全新全球电竞赛事--世界超级联赛WSL发布首项赛事计划

热门文章

  1. prisma 风格设置_Prisma中的身份验证-第1部分:设置
  2. [语义分割]CTNet: Context-based Tandem Network for Semantic Segmentation
  3. 即将毕业大学生的第一个五年计划
  4. 2020年,抖音赚钱全攻略,做抖音,看这就够了!
  5. maxwell采集mysql binlog 日志数据到kafka topic
  6. 【Strategy模式】C++设计模式——策略模式
  7. Docker 中 latest 标签引发的困惑
  8. Gradle dependencies 解决项目依赖冲突
  9. 批量替换 Word 文档某几页
  10. 用计算机写作文主题,《用计算机写作文》教学设计(周未定)