Qt中Lambda表达式的返回值问题:control reaches end of non-void function [-Wreturn-type]

62 篇文章 104 订阅

Qt程序构建后警告:control reaches end of non-void function [-Wreturn-type]
它的意思是:控制到达非void函数的末尾。意识就是一些本应带有返回值的函数到达结尾后可能并没有返回任何值。
警告出现的代码段如下:

    connect(UpdateTemp,&QTimer::timeout,[=]()
    {

        //qDebug()<<"嘿!";
       //存入数据库
        QSqlQuery query;
       QString sql = QString("insert into data(time,ion,temperature,humidity) values('%1',%2,%3,%4)")
             .arg(current_date)
             .arg(ion)
             .arg(temperature)
             .arg(humidity);
            if(!query.exec(sql))
             {
                QSqlError lastError = query.lastError();
                //qDebug()<<lastError.driverText()<<QString(QObject::tr("Insert failed!"));
                ui->textEditRead->append("Insert failed!");
                return false;
             }
    }
    );//这里警告提示

一开始我是有点奇怪的,我这里明明是一个无参lambda呀!检查之后发现,我在一个if判断里面返回了一个false,但如果if判断不成立,程序结尾是没有返回值的,与if里面的返回值不统一,要么都有同种类型的返回值,要么都没有。

 if(!query.exec(sql))
             {
                QSqlError lastError = query.lastError();
                //qDebug()<<lastError.driverText()<<QString(QObject::tr("Insert failed!"));
                ui->textEditRead->append("Insert failed!");
                return false;
             }

找到问题根源之后,就很好解决了:
1、屏蔽if的返回值//return false; 使lambda函数体内没有返回值(我用的这种方法,因为我这个表达式不需要返回值);
2、保留if的返回值,同时在lambda函数尾部也返回一个bool值,与if中的返回值类型保持一致:

    connect(UpdateTemp,&QTimer::timeout,[=]()
    {

        //qDebug()<<"嘿!";
       //存入数据库
        QSqlQuery query;
       QString sql = QString("insert into data(time,ion,temperature,humidity) values('%1',%2,%3,%4)")
             .arg(current_date)
             .arg(ion)
             .arg(temperature)
             .arg(humidity);
            if(!query.exec(sql))
             {
                QSqlError lastError = query.lastError();
                //qDebug()<<lastError.driverText()<<QString(QObject::tr("Insert failed!"));
                ui->textEditRead->append("Insert failed!");
                return false;
             }
    return true;}//根据实际情况,选择false或true
    );

总之lambda表达式的返回值类型需要与其参数类型一致,如:[](){}不需要返回值,[](int a,int b){}返回值为int;lambda函数体内可以没有返回值,但如果有返回值,无论什么情况,函数体内都必须有一个返回值,且函数体内的返回值类型必须保持一致
另外,lambda表达式是可以显示指定返回值类型的
lambda太复杂时,无法进行返回值推演。如果需要返回值,请显式指定返回值类型,如:[]()->bool{}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值