El siguiente ejemplo demuestra el problema que encontramos en VC++ 2010:¿Qué son las reglas de búsqueda cuando se llama a la función de lambda?
class Foo
{
template<class T>
static T foo(T t) { return t; }
public:
void test()
{
auto lambda = []() { return foo(1); }; // call to Foo::foo<int>
lambda();
}
};
VC++ produce: error C3861: 'foo'
: identificador no encontrado
Si califico la llamada a foo: Foo::foo(1);
entonces este ejemplo compila con una advertencia: advertencia C4573: el uso de 'Foo::foo'
requiere que el compilador capture 'this'
pero el modo de captura predeterminado actual no lo permite
¿Qué dice la norma sobre este caso? ¿Debería encontrar un nombre no calificado? ¿El nombre calificado requiere capturar this
?
Hm, eso es raro. Es estático, por lo que no debería requerir 'esto'. Sospecho que es un error del compilador y que no encontrarlo es un efecto secundario del compilador que cree que necesita 'esto' para usarlo. –
Esto también ocurre con g ++, por lo que no parece un error. Si lo cambia a [&]() en lugar de [](), entonces compila bien, pero eso se debe a que toma esto por referencia. – DrYap
Habiendo dicho eso [otro hilo] (http://stackoverflow.com/questions/4940259/c0x-lambdas-require-capturing-this-to-call-static-member-function) dice que es un error. – DrYap