gpt4 book ai didi

c++ - 如果存储原始引用的类超出范围,捕获成员引用是否安全?

转载 作者:可可西里 更新时间:2023-11-01 16:34:07 25 4
gpt4 key购买 nike

考虑一下:

#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();
}

我的直觉是,由于在执行任务时实际的引用对象仍然存在,我们在遇到 lambda 时得到一个新绑定(bind)的引用,一切都很好。

但是,在我的 GCC 4.8.5 (CentOS 7) 上,我看到一些行为(在一个更复杂的程序中)表明这是 UB 因为 f,引用 f.x 本身,已经死了。是吗?

最佳答案

要捕获成员引用,您需要使用以下语法(在 C++14 中引入):

struct Foo
{
int & m_x;

void bar()
{
task = [&l_x = this->m_x]() { std::cout << l_x << '\n'; };
}
};

这样 l_x 是一个 int & 存储在闭包中并引用相同的 intm_x 是引用并且不受 Foo 超出范围的影响。

在 C++11 中,我们可以通过值捕获指针来解决此功能缺失的问题:

struct Foo
{
int & m_x;

void bar()
{
int * p_x = &m_x;
task = [=]() { std::cout << *p_x << '\n'; };
}
};

关于c++ - 如果存储原始引用的类超出范围,捕获成员引用是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47592474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com