在 lambda 中移动参数捕获
Move capture of parameter in lambda
MCVE : http://coliru.stacked-crooked.com/a/ef442eca9b74c8f1
我想按照 Move capture in lambda 中的教程在 lambda 函数中移动参数。
#include <string>
#include <iostream>
#include <functional>
class B{};
void f(B&& b){}
int main(){
B b;
auto func_lambda=[b{std::move(b)}](){
//f(std::move(b)); // also fails
f(b); // also fails
};
//: std::function<void()> func_cache=func_lambda();
// will be stored and called after 'b' is out of scope
}
我收到这个错误:-
main.cpp: In lambda function: main.cpp:10:11:
error: cannot bind rvalue reference of type 'B&&' to lvalue of type 'const B'
main.cpp:5:12: note: initializing argument 1 of 'void f(B&&)'
我也试过 [b=std::move(b)]
但失败了 (link= ).
如何正确移动参数?
移动语义仅适用于可变对象。您需要使您的 lambda 可变:
auto func_lambda = [b = std::move(b)]() mutable {
f(std::move(b));
};
但是你只能调用一次这样的 lambda。如果您想多次调用它,则必须生成值或使用 std::exchange(b, B{})
MCVE : http://coliru.stacked-crooked.com/a/ef442eca9b74c8f1
我想按照 Move capture in lambda 中的教程在 lambda 函数中移动参数。
#include <string>
#include <iostream>
#include <functional>
class B{};
void f(B&& b){}
int main(){
B b;
auto func_lambda=[b{std::move(b)}](){
//f(std::move(b)); // also fails
f(b); // also fails
};
//: std::function<void()> func_cache=func_lambda();
// will be stored and called after 'b' is out of scope
}
我收到这个错误:-
main.cpp: In lambda function: main.cpp:10:11: error: cannot bind rvalue reference of type 'B&&' to lvalue of type 'const B' main.cpp:5:12: note: initializing argument 1 of 'void f(B&&)'
我也试过 [b=std::move(b)]
但失败了 (link=
如何正确移动参数?
移动语义仅适用于可变对象。您需要使您的 lambda 可变:
auto func_lambda = [b = std::move(b)]() mutable {
f(std::move(b));
};
但是你只能调用一次这样的 lambda。如果您想多次调用它,则必须生成值或使用 std::exchange(b, B{})