gpt4 book ai didi

c++ - lambda 捕获的对象是否存在与 lambda 一样长的时间?

转载 作者:行者123 更新时间:2023-12-05 09:25:47 25 4
gpt4 key购买 nike

我一直认为 lambda 只是函数指针,但我从未想过认真使用捕获语句......

如果我创建一个通过拷贝捕获的 lambda,然后将该 lambda 移动到一个完全不同的线程并且不尝试保存 lambda 中使用的原始对象,它会为我保留那些拷贝吗?

std::thread createThread() {
std::string str("Success");
auto func = [=](){
printf("%s", str.c_str());
};
str = "Failure";
return std::thread(func);
}

int main() {
std::thread thread = createThread();
thread.join();
// assuming the thread doesn't execute anything until here...
// would it print "Success", "Failure", or deference a dangling pointer?
return 0;
}

最佳答案

保证打印Success。按拷贝捕获完全按照它说的去做。它就在那里制作对象的拷贝并将该拷贝存储为闭包对象的一部分。从捕获创建的闭包对象的成员与闭包对象本身一样长。

lambda 不是函数指针。 Lambda 是可以具有内部状态的通用函数对象,这是函数指针所没有的。事实上,只有无捕获的 lambda 可以转换为函数指针,因此有时可能表现得像一个函数指针。

lambda 表达式产生一个基本上看起来像这样的闭包类型:

struct /*unnamed1*/ {
/*unnamed1*/(const /*unnamed1*/&) = default;
/*unnamed1*/(/*unnamed1*/&&) = default;

/*unnamed1*/& operator=(const /*unnamed1*/&) = delete;

void operator()() const {
printf("%s", /*unnamed2*/.c_str());
};

std::string /*unnamed2*/;
};

并且 lambda 表达式生成一个这种类型的对象,/*unnamed2*/ 直接初始化为 str 的当前值。 (直接初始化的意思好像是 std::string/*unnamed2*/(str);)

关于c++ - lambda 捕获的对象是否存在与 lambda 一样长的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75065260/

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