在c ++ 11中按值捕获成员变量的好方法是啥? [复制]
Posted
技术标签:
【中文标题】在c ++ 11中按值捕获成员变量的好方法是啥? [复制]【英文标题】:What's a good way to capture member variable by value in c++11? [duplicate]在c ++ 11中按值捕获成员变量的好方法是什么? [复制] 【发布时间】:2016-02-05 18:50:37 【问题描述】:struct myclass
myclass()
myclass(int qx):z(qx)
std::function<void()> create()
auto px = [z]()
std::cout << z << std::endl;
;
return px;
int z;
;
myclass my;
my.z = 2;
auto func = my.create();
func();
my.z = 3;
func();
这段代码将在 gcc 4.6.3 中编译,它会正确地复制成员变量z
,并且两个打印都会得到2
。在 gcc 4.8.2 中,这不再编译了..
error: 'this' was not captured for this lambda function
我想知道为什么这个功能被删除了,因为它非常有用。
【问题讨论】:
【参考方案1】:我认为您不能直接在 C++11 中执行此操作(有关解决方法,请参阅@Nawaz 的评论)。但是,C++14 在这种情况下正好有帮助,通过generalized lambda captures:
auto px = [v = this->z]() // capture by value just ONE member variable
std::cout << v << std::endl;
;
例子:
#include <functional>
#include <iostream>
struct myclass
myclass(): z
myclass(int qx): z(qx)
std::function<void()> create()
auto px = [v = this->z]()
std::cout << v << std::endl;
;
return px;
int z;
;
int main()
myclass my;
my.z = 2;
auto func = my.create();
func();
my.z = 3;
func();
Live on Coliru
【讨论】:
解决方法:auto z = this->z; auto px = [z] ... ;
.
@Nawaz 是的,确实,谢谢。【参考方案2】:
Lambda 只能捕获声明它们的本地范围的成员。它们无法通过复制或引用来捕获成员变量。
但是,C++14 的广义 lambda 捕获可以完成工作:
auto px = [z = z]()
std::cout << z << std::endl;
;
您可以使用this->z
限定内部z
,以明确您在做什么。
如果 C++14 不可用,您可以通过在函数中创建一个临时变量来显式捕获该变量,该变量将被捕获:
auto z = this->z;
auto px = [z]()
std::cout << z << std::endl;
;
【讨论】:
以上是关于在c ++ 11中按值捕获成员变量的好方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章