推导Lambda捕获类型

Mr.*_*son 9 c++ c++11

我最近发现,const通过lambda中的值捕获对象,意味着labmda体内的变量(即lambda的数据成员)也为const
例如:

const int x = 0;
auto foo = [x]{
  // x is const int
};
Run Code Online (Sandbox Code Playgroud)

C ++ 17草案中的第8.1.5.2节提到了此行为:

对于每个通过副本捕获的实体,在闭包类型中声明一个未命名的非静态数据成员。这些成员的声明顺序未指定。如果实体是对对象的引用,则此数据成员的类型为引用的类型;如果实体是对函数的引用,则为对引用的函数类型的左值引用;否则为相应捕获的实体的类型。匿名工会的成员不得被抄袭。

我希望推论捕获变量的类型将与推导auto相同。
是否有充分的理由对捕获的类型使用不同的类型推导规则?

Bri*_*ian 7

在您的示例中,x由于lambda不是mutable,因此无法进行修改,这使函数调用operator const。但是,即使lambda是mutable,也确实引用的段落成为xlambda 的类型const int

如果我没记错的话,这是C ++ 11中的一个故意设计决定,以使xlambda中的使用行为x与封闭范围中的使用类似。那是,

void foo(int&);
void foo(const int&);
const int x = 0;
foo(x);  // calls foo(const int&)
auto foo = [x]() mutable {
    foo(x);  // also calls foo(const int&)
};
Run Code Online (Sandbox Code Playgroud)

这有助于避免例如在重写某些代码时从显式循环到使用lambda调用标准库算法的错误。

如果我对这次回忆不正确,希望答案正确的人会介入并写下自己的答案。