L'esempio seguente dimostra il problema che ho incontrato in VC++ 2010:Quali sono le regole di ricerca quando si chiama function da 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: errore C3861: 'foo'
: identificatore non trovato
Se sono ammesso la chiamata a foo: Foo::foo(1);
allora questo esempio compila con un avviso: avviso C4573: l'utilizzo di 'Foo::foo'
richiede al compilatore di acquisire 'this'
ma la modalità di acquisizione predefinita corrente non lo consente
Che cosa dice lo standard su questo caso? Dovrebbe essere trovato il nome non qualificato? Il nome qualificato richiede l'acquisizione di this
?
Hm, è strano. È statico, quindi non dovrebbe richiedere "questo". Ho il sospetto che sia un bug del compilatore e che non trovandolo sia un effetto collaterale del compilatore che pensa che sia necessario "questo" utilizzarlo. –
Questo succede anche con g ++ quindi non sembra un bug. Se lo cambi in [&]() invece di [](), questo compila bene ma è perché prende questo per riferimento. – DrYap
Detto questo [un altro thread] (http://stackoverflow.com/questions/4940259/c0x-lambdas-require-capturing-this-to-call-static-member-function) dice che è un bug. – DrYap