首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11仿真C++14广义lambda捕获与可变说明符的关系

C++11仿真C++14广义lambda捕获与可变说明符的关系
EN

Stack Overflow用户
提问于 2020-05-15 18:45:41
回答 1查看 43关注 0票数 0

在“有效的现代C++”第32项第227-228页中,Scott介绍了下面的代码,以解决C++11中缺乏generalized lambda captures的问题。

代码语言:javascript
复制
// data is in scope
auto func =
  std::bind(
      [](const std::vector<double>& x) // I've renamed it x so there's no ambiguity in my description below
      { /* usses of x */ },
      std::move(data)
  );

然后他做了以下的评论,我不完全理解。

默认情况下,从lambda生成的闭包类中的

成员函数是const。这样做的效果是在lambda的主体中呈现闭包const中的所有数据成员。但是,绑定对象中移动构造的data副本不是const,因此为了防止在lambda中修改data副本,lambda的参数被声明为对-const的引用。如果lambda被声明为mutable,那么它的闭包类中的operator()将不会被声明为const,在lambda的参数声明中省略const是合适的:

// data在作用域自动func = std::bind( std::vector& x可变//同上{x */ }的/*用法,std::move(data) );

我试着打破它:

  • (non-mutable) lambda闭包具有operator()成员函数const
  • ,因此它们不能修改捕获的变量;

(然而,lambda一开始并没有捕捉到任何东西,因此以下几点似乎与我无关.)

  • std::bind object;
  • since的非const成员变量中复制(好的,移动) data,lambda通过引用(而不是通过值)接受参数(因为其全部目的是模拟C++14的move lambda捕获),程序员可以通过nounintentional);
  • to的主体内的x修改data (这可以避免这一点,参数是const&.

)。

所以,如果兰博达被宣布了,我不明白最后一段时间的意义.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 18:45:41

好的,写这个问题让我明白,我只是忽略了代码的最初动机:模拟一个通用的lambda捕获。

也许Scott还暗示,代码的编写人员期望bind对象func与存储在func中的实际lambda具有相同的说明符时,其行为与所需的lambda类似,这是很自然的(实际上,文本只引用了mutable说明符,可能是因为它是唯一值得讨论的)。

换句话说,

看到通过func;

  • if存储在func中的非mutable lambda,程序员很可能期望func将作为对应的非mutable C++14 lambda运行,因此实际lambda参数的constmutable,那么用户希望func以相应的mutable C++14λ的形式运行,因此他不期望它未经修改就保留捕获的值,因此在第二块代码中缺少d17。H 218F 219代码>F 219代码。

甚至更短:

存储在mutable中的非mutable lambda不应该修改其参数,因为相应的非mutable C++14 lambda不会修改其捕获的变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61826276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档