non-const lvalue reference to type 'QString' cannot bind to a temporary of type 'QString'

1. 先看问题

函数定义: void fillFileMap(QString & fileName);

调用:

QFileInfoList list = dir.entryInfoList();
    for (int i = 0; i < list.size(); ++i) {
        QFileInfo fileInfo = list.at(i);
        fillFileMap(fileInfo.fileName()); //报错non-const lvalue reference to type 'QString' cannot bind to a  temporary of type 'QString'
    }

2. 分析

  先看fillFileMap(fileInfo.fileName())这一句,fileInfo.fileName()返回的值QString 会保存在一个临时变量(temporary of type 'QString')中,而fillFileMap函数的定义是QString的引用,且这个引用是非const的,则在fillFileMap函数中就有对这个参数fileName的修改的可能,如果要修改这个值,但是这个值是个临时变量,随时可能被释放掉。所以,对这种行为c++编译器是不允许的,所以加入了临时变量不能作为非const引用的语义限制,来避免这种不合理的行为。

 

3. 如何修改

(1) 调用的地方定义变量,函数调用传入变量
   QFileInfoList list = dir.entryInfoList();    
for (int i = 0; i < list.size(); ++i) 
{        
    QFileInfo fileInfo = list.at(i);
    QString fileName = fileInfo.fileName();        
    fillFileMap(fileName );    
}

修改成这样之后,即使在fillFileMap中修改了fileName也无所谓,fileName 在fillFileMap调用结束,本次循环结束之后才释放

(2) 修改函数的定义为const引用

void fillFileMap(const QString & fileName);

QFileInfoList list = dir.entryInfoList();
    for (int i = 0; i < list.size(); ++i) {
        QFileInfo fileInfo = list.at(i);
        fillFileMap(fileInfo.fileName()); //不再报错
    }

函数定义改成const引用后,就保证了用户不可能再有机会去操作这个临时变量,编译通过。

 

 

 

 

 

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值