我最近发现,const
通过lambda中的值捕获对象,意味着labmda体内的变量(即lambda的数据成员)也为const
。
例如:
const int x = 0;
auto foo = [x]{
// x is const int
};
Run Code Online (Sandbox Code Playgroud)
对于每个通过副本捕获的实体,在闭包类型中声明一个未命名的非静态数据成员。这些成员的声明顺序未指定。如果实体是对对象的引用,则此数据成员的类型为引用的类型;如果实体是对函数的引用,则为对引用的函数类型的左值引用;否则为相应捕获的实体的类型。匿名工会的成员不得被抄袭。
我希望推论捕获变量的类型将与推导auto相同。
是否有充分的理由对捕获的类型使用不同的类型推导规则?
在您的示例中,x
由于lambda不是mutable
,因此无法进行修改,这使函数调用operator const
。但是,即使lambda是mutable
,也确实引用的段落成为x
lambda 的类型const int
。
如果我没记错的话,这是C ++ 11中的一个故意设计决定,以使x
lambda中的使用行为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调用标准库算法的错误。
如果我对这次回忆不正确,希望答案正确的人会介入并写下自己的答案。
归档时间: |
|
查看次数: |
143 次 |
最近记录: |