C++ Lambdas:"mutable"和按引用捕获之间的区别
C++ Lambdas: Difference between "mutable" and capture-by-reference
在c++中,你可以像这样声明lambdas:
int x = 5;
auto a = [=]() mutable { ++x; std::cout << x << 'n'; };
auto b = [&]() { ++x; std::cout << x << 'n'; };
都让我修改x
,那么区别是什么?
发生了什么
第一个将只修改自己的x
副本,而保持外部的x
不变。第二个将修改x
外的。
在尝试后添加一个print语句:
a();
std::cout << x << "----n";
b();
std::cout << x << 'n';
预期输出:
6
5
----
6
6
考虑lambda
可能有所帮助[…]表达式提供了一种简洁的方式来创建简单的函数对象
<一口>(见[expr.prim。一口>
他们有
[…一个公共内联函数调用操作符[…]
被声明为const
成员函数,但只有
[…]当且仅当lambda表达式的参数声明子句后面没有
mutable
你可以这样想
int x = 5;
auto a = [=]() mutable { ++x; std::cout << x << 'n'; };
==>
int x = 5;
class __lambda_a {
int x;
public:
__lambda_a () : x($lookup-one-outer$::x) {}
inline void operator() { ++x; std::cout << x << 'n'; }
} a;
和
auto b = [&]() { ++x; std::cout << x << 'n'; };
==>
int x = 5;
class __lambda_b {
int &x;
public:
__lambda_b() : x($lookup-one-outer$::x) {}
inline void operator() const { ++x; std::cout << x << 'n'; }
// ^^^^^
} b;
Q:但是如果它是const
函数,为什么我仍然可以更改x
?
A:您只更改外部x
。lambda自身的x
是一个引用,操作++x
不会修改引用,而是修改被引用的值。
这是有效的,因为在c++中,指针/引用的constness不会改变通过它看到的指针/引用的constness。
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 按引用传递和按地址传递之间的差异
- 常量引用和引用之间的区别
- 按值和引用传递指针之间的区别?
- C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 按引用传递和动态内存分配之间的区别是什么
- 左值引用和右值引用之间的区别
- 通过引用传递对象和基元之间的区别
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- Rcpp 中值和引用参数之间的差异
- 是否有任何好的解决方案可以解决C 中两个类之间的交叉引用
- 返回右值引用和 &&限定函数中的值之间的区别
- 是否可以通过引用将方法从类传递到全局函数或在类之间传递?
- DLL 引用之间的区别?和用途?
- C++中的变量和引用之间的区别是什么
- 本机C++类与 WinRT 组件(引用类)之间的自动映射