在[和捕获]和[&local = capture]在lambdas中捕获之间有什么区别?

Mar*_*877 9 c++ lambda c++14

vector<int> vec;

//a
auto foo = [&vec](){
    //do something
};

//b
auto foo = [&v = vec](){
    //do something
};
Run Code Online (Sandbox Code Playgroud)

我是否理解正确,只有a和b之间的区别是在b情况下为"vec"创建别名"v"或者还有更多内容吗?

小智 11

在这种情况下,没有真正的区别.但是,如果您按值捕获,则会有所不同:

const std::vector<int> vec; // note const

auto foo = [vec]() mutable {
   // can't change vec here since it is captured with cv-qualifiers
};

auto bar = [v = vec]() mutable {
    // can change v here since it is captured by auto deduction rules
    // (cv-qualifiers dropped)
};
Run Code Online (Sandbox Code Playgroud)


Jod*_*cus 5

基本上没有.它只是允许您为捕获的值提供自定义名称.

但是请注意,当您想要将对象实际移动到闭包中时,需要使用此语法(称为init捕获):

std::vector<int> vector;
auto lambda = [vec = std::move(vector)]() { /* the lambda owns the vector now */ });
Run Code Online (Sandbox Code Playgroud)

  • 这不会捕获右值引用.它捕获使用右值引用构造的值. (5认同)