【发布时间】:2021-07-01 14:05:46
【问题描述】:
我使用 QScopedPointer 实用程序创建了一个小部件对象,并将其用于 lambda 连接函数。结果,它产生了编译时错误。
QScopedPointer<QMessageBox> errBox(new QMessageBox());
errBox->setText("some text");
QObject::connect(errBox,&QMessageBox::buttonClicked,this,[=](QAbstractButton *button){
qInfo()<<"clicked button"<<button->text();
});
但是,当我用正常初始化替换 QScopedPointer 时,它工作得很好。
QMessageBox *errBox = new QMessageBox();
errBox->setText("some text");
QObject::connect(errBox,&QMessageBox::buttonClicked,this,[=](QAbstractButton *button){
qInfo()<<"clicked button"<<button->text();
});
我浏览了 Qt Docs 并发现:
编译器为 QScopedPointer 生成的代码与当 手动编写。使用 delete 的代码是 QScopedPointer 用法(如果没有,可能是另一种类型的智能 指针,例如 QSharedPointer)。 QScopedPointer 故意没有 复制构造函数或赋值运算符,这样所有权和 清楚地传达了生命周期。
我想知道编译错误的原因。还有其他方法可以在 lambda 中使用 QScopedPointer 吗? 我在这里错过了什么?
【问题讨论】:
-
编译时错误的文本是否出于某种原因而成为秘密?