lambda函数在Qt中使用时的一个奇怪现象

本文探讨了在Qt中使用lambda函数时遇到的一个现象:即使使用值引用,lambda函数也能成功修改成员变量btn。通过实验发现,这实际上是由于lambda函数隐式捕获了this指针,而非直接捕获btn。当尝试将btn作为局部变量时,由于QPushButton的复制构造函数被删除,导致值传递报错。修改后的lambda函数通过捕获this指针仍然可以访问并修改btn,揭示了在类成员函数中成员变量访问的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题描述

 首先,定义MainWindow如下所示:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QPushButton btn;
};

 然后,在MainWindow的构造函数使用“值引用”的lambda函数,可以对btn按钮进行改动。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    btn.setText("click");
    btn.setParent(this);

    [=] () {
        btn.setText("don't click");
        btn.resize(100, 50);
        btn.move(70, 0);
    } ();
}

结果如下所示:

 怪异的地方在于,此处lambda函数为值引用,为何可以对btn进行修改,且修改成功。

2、实验

带着以上疑问,进行了实验。首先将btn去掉,使其不为MainWindow的一个私有变量,而是使其成为MainWindow构造函数中的局部变量,如下所示:

MainWindow::MainWindo
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值