我想在lambda中修改一个变量而不影响封闭范围.表现得像这样的东西:
std::vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
{
auto sum = 0;
std::for_each(vec.begin(), vec.end(), [sum](int value) mutable
{
sum += value;
std::cout << "Sum is up to: " << sum << '/n';
});
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够在不声明sumlambda之外的变量的情况下完成它.像这样的东西:
std::vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
std::for_each(vec.begin(), vec.end(), [auto sum = 0](int value) mutable
{
sum += value;
std::cout << "Sum is up to: " …Run Code Online (Sandbox Code Playgroud) 我想创建一个我想要超出范围的对象,但是设置对其字段的引用.这种做法有什么好处吗?
A* a;
B* b;
[a, b]
{
static Loader loader("some", "argument", "the constructor", "takes");
a = loader.getA();
b = loader.getB();
}();
Run Code Online (Sandbox Code Playgroud)
匿名lambda是否以其拥有的价值被摧毁?是否有更好的设计模式来实现同样的目标?
好吧,这似乎是一个很好的方法.我的问题仍然是,如果匿名lambda在解析时被破坏(并且使用它拥有的静态变量).
有这样的c ++代码:
auto func = [=, vec1=std::move(vec)]() {
printf("%x %x %x\n", p,vec1.data(), vec.data());
};
Run Code Online (Sandbox Code Playgroud)
当我编译它时-std=c++11,编译器打印warning
lambda capture initializers only available with -std=c++14 or -std=gnu++14,
但代码可以正常运行,所以我需要处理它warnning.