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引用后,就保证了用户不可能再有机会去操作这个临时变量,编译通过。