【问题标题】:C++ closure syntax errorC++ 闭包语法错误
【发布时间】:2012-08-08 14:21:04
【问题描述】:

这里的语法有什么问题?我关注this资源。

char x = 'a', y = 'a';

[&x,=y]() { // error: expected identifier before '=' token
  ++x; ++y; // error: 'y' is not captured
}();

我使用 MinGW g++ 4.5.2 命令行编译器和-std=c++0x

澄清:我想按值传递y

【问题讨论】:

  • 要增加y 的值,必须通过引用来捕获它。要按价值捕获,只需编写y 就足够了。不需要写`=y'
  • @AdityaKumar 全部为真,但 OP 只是试图从博客文章中编译一个示例,其中博客作者专门通过值传递了第二个参数,以表明增量的效果不会影响关闭over 变量(因为按值传递是一个副本)。
  • 默认值捕获不可修改。关于它的各种问题,例如stackoverflow.com/questions/5501959/…
  • @BoBTFish:我明白了——谢谢,现在很清楚了。

标签: c++ c++11 lambda closures


【解决方案1】:
char x = 'a', y = 'a';

[&x,y]() mutable{
  ++x; ++y;
}();

Live example.

是正确的代码。要捕获变量按值,只需写下它的名称。要允许修改按值捕获,需要将 lambda 标记为 mutable,否则将 operator() 标记为 const

§5.1.2 [expr.prim.lambda] p5

[...] 当且仅当 lambda-expressionparameter-declaration-clause 后面不跟 可变。 [...]

【讨论】:

  • 您的示例使用 C++11,这是有效的 C++03 语法吗?
  • @Wolf 问题是关于 lambdas 的。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 2014-10-06
  • 2015-02-23
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多