gpt4 book ai didi

c++ - 使用可变参数模板函数在 lambda 中传递文字的正确引用时出现段错误

转载 作者:行者123 更新时间:2023-12-03 06:54:59 27 4
gpt4 key购买 nike

代码如下

#include <functional>
#include <iostream>

using namespace std;
int foo(int a){
cout<<a;
return a;
}

template<typename R, typename ...Args>
function<void()> wrapper( R f, Args&& ... args) {
function<void()> fun([&] { f(forward<Args...>(args...)); });//crash
//function<void()> fun=bind(f,forward<Args...>(args...));
return fun;
}

int main(){
auto d=wrapper(foo,1);
d();
return 0;
}

当我使用绑定(bind)时,一切都很好。但是当我使用 lambda 时程序崩溃了。我想知道有没有一种方法可以通过引用为 lambda 捕获变量,但可以通过值捕获文字(为了提高效率)?还是我应该坚持使用绑定(bind)?

最佳答案

function<void()> fun([&] { f(forward<Args...>(args...)); });//crash

所有这些捕获的对象,f 和所有 args,都是通过引用捕获的。

它们都是wrapper的参数。

但是一旦 wrapper 返回,wrapper 的所有参数都会超出范围并被销毁。而您的 lambda 捕获的所有引用都变成了悬空引用。

我可能会在这里看到一些回旋余地,可能是当 可能wrapper 参数本身引用时,lambda 然后捕获对原始对象的引用,而不是 wrapper 参数本身。

但这里没有任何保证。

因此,这几乎保证了未定义的行为。

确实有语法可以通过值捕获 f,并通过引用捕获其他所有内容,但这对您没有帮助。

auto d=wrapper(foo,1);

因为即使在这种情况下,您正在使用的参数也是纯右值,当 wrapper 返回时,它会在一阵烟雾中消失,让您的 lambda 变成一个空包,持有悬垂引用。

除了按值捕获一切,您在这里没有任何现实的选择。

关于c++ - 使用可变参数模板函数在 lambda 中传递文字的正确引用时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63866346/

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