考虑一下:
#include <iostream>
#include <functional>
std::function<void()> task;
int x = 42;
struct Foo
{
int& x;
void bar()
{
task = [=]() { std::cout << x << '\n'; };
}
};
int main()
{
{
Foo f{x};
f.bar();
}
task();
}
Run Code Online (Sandbox Code Playgroud)
我的直觉是,当执行任务时,实际的指示对象仍然存在,我们在遇到lambda时得到一个新绑定的引用,一切都很好.
但是,在我的GCC 4.8.5(CentOS 7)上,我看到一些行为(在一个更复杂的程序中)表明这是UB,因为f并且引用f.x本身已经死亡.是对的吗?
use*_*670 10
要捕获成员引用,您需要使用以下语法(在C++ 14中引入):
struct Foo
{
int & m_x;
void bar()
{
task = [&l_x = this->m_x]() { std::cout << l_x << '\n'; };
}
};
Run Code Online (Sandbox Code Playgroud)
这种方式l_x是int &存储在闭包中并引用相同的int值m_x引用并且不受Foo超出范围的影响.
在C++ 11中,我们可以通过值捕获指针来解决此功能的缺失:
struct Foo
{
int & m_x;
void bar()
{
int * p_x = &m_x;
task = [=]() { std::cout << *p_x << '\n'; };
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
355 次 |
| 最近记录: |