请考虑以下代码:
class A
{
public:
void foo()
{
auto functor = [this]()
{
A * a = this;
auto functor = [a]() // The compiler won't accept "this" instead of "a"
{
a->bar();
};
};
}
void bar() {}
};
在VC2010中,使用this
代替a
会导致编译错误。其中包括:
1>main.cpp(20): error C3480: '`anonymous-namespace'::<lambda0>::__this': a lambda capture variable must be from an enclosing function scope
1>main.cpp(22): error C3493: 'this' cannot be implicitly captured because no default capture mode has been specified
我不明白。这是否意味着它不知道它是应该使用引用还是复制它?在尝试使用&this
强制引用时,它还会说:
1>main.cpp(20): error C3496: 'this' is always captured by value: '&' ignored
暂时不是那么烦人,但为了好奇,有没有办法摆脱它?将this
赋予lambda时会发生什么?
答案 0 :(得分:6)
这似乎是VS2010中的编译器错误。通过让内部lambda隐式捕获this
:
class A
{
public:
void foo()
{
auto functor = [this]()
{
auto functor = [=]()
{
bar();
};
};
}
void bar() {}
};
当尝试使用&amp; this强制引用时,它还会说:
1&gt; main.cpp(20):错误C3496:'this'始终按值捕获:'&amp;'忽略
this
只能按值捕获。 [=]
和[&]
都按值捕获。
当给予lambda时会发生什么?
我不知道,但它必须是特殊的东西,因为你不能在lambda中使用this
作为指向lambda对象的指针。其他任何捕获的都会成为lambda的私有成员,因此大概this
也会这样做,但是在使用方面有一些特殊处理。
答案 1 :(得分:2)
This is a known bug with the Visual Studio 2010 compiler(由FrédéricHamidi的评论引用)。
您必须明确捕获this
以将其传递给另一个lamba的捕获规范。这也适用于在lambda的封闭lambda之外声明的局部变量,即使使用[&]
捕获规范也是如此。