- 主题:lambda capture 的一个问题
今天有朋友跟我说这么干没问题:
void test() {
const string &s = some_func();
add_callback([s] {
do_something_to(s);
});
}
我的理解,这个 lambda 会被扩展成这样子:
class lambda {
const string &s;
operator () {}
};
一旦这个 lambda 离开了 test(),被 capture 的 s 就不对了。
而我朋友认为是这样:
class lambda {
const string s;
operatior () {}
};
有熟读标准的说说这个怎么回事吗?
--
FROM 110.81.42.*
#include <QtCore/qdebug.h>
#include <QtCore/qstring.h>
int main()
{
const QString &s = QString::fromUtf8("hello!");
qDebug() << &s;
([s] {
qDebug() << &s;
})();
return 0;
}
输出
0x7ffe678780a8
0x7ffe678780b0
说明我朋友说的是对的?
【 在 ble (ble) 的大作中提到: 】
: 写个例子跑一下?
--
FROM 110.81.42.*
也就是说 [s] 一定会在 lambda 内部生成一个 const T 的字段是吗?其中 T 是原始类型?
外部是`T &&`, `const T&`, `volatile T`, `register T`, `union T`
这里一定会执行复制构造函数?
【 在 z16166 (Netguy) 的大作中提到: 】
: 规范有明确说明。这句:
: “The type of such a data member is the referenced type if the entity is a reference to an object”。
: ISO_IEC_14882__2020-12.pdf 这个在110页,"7.5.5.3 Captures"这一节的第10条:
: ...................
--
FROM 112.47.122.*