gpt4 book ai didi

c++ - lambda[=] 上的复制值被另一个封装的 lambda[&] 阻止

转载 作者:行者123 更新时间:2023-12-03 10:07:49 25 4
gpt4 key购买 nike

用户想要传参但是被封装库的[&]挡住了,这里是coliru MCVE :-

#include <iostream>
#include <string>
#include <type_traits>
#include <vector>
#include <functional>
int main(){
std::vector<std::function<void()>> funcs;
for(int n=0;n<3;n++){
auto func=[&,n](){ //[=] for n
std::cout<<""<<n; // user's code
};
//v library (actually inside another utility function)
funcs.push_back([&](){ //user's "n" is blocked ??
//(some library-related code here)
func();
});
//^ library
}
//v library
for(int m=0;m<3;m++){
funcs[m]();
}
}

它打印 222 而不是 012
为什么,以及如何解决它?
请注意,库无法知道 n

根据相关问题(c++ lambda capture by value),应该正确复制该值。

这是一个更复杂的 MCVE做同样的事情,但可以更好地描述我实际使用它的方式:-

#include <iostream>
#include <string>
#include <type_traits>
#include <vector>
#include <functional>

std::vector<std::function<void()>> libraryStuff;
template<class F>void addToLibrary(F f){
libraryStuff.push_back([&](){ //user's "n" is blocked ??
//some code library related
f();
});
}
void libraryDoNow(){
for(int m=0;m<libraryStuff.size();m++){
libraryStuff[m]();
}
}
int main(){
std::vector<std::function<void()>> funcs;
for(int n=0;n<3;n++){
auto func=[&,n](){
std::cout<<""<<n; // user's code
};
addToLibrary(func);
}
libraryDoNow();
}

最佳答案

您正在通过 funcs.push_back([&](){..};

中的引用捕获 func

这会导致悬空引用,因为 func 在稍后被调用之前超出范围:

//v library
for(int n=0;n<3;n++)
funcs[n]();

您需要按值捕获局部变量 func 以获得它的拷贝(它包含 n-value)。

关于c++ - lambda[=] 上的复制值被另一个封装的 lambda[&] 阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58110195/

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