2011-09-02 10 views
6

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?

+0

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. –

+0

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

+0

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

risposta

4

Microsoft ha riscontrato questo problema in diversi casi. Vedi:

Scope Resolution with lambdas interferes with namespace and type resolution

Template resolution in lambdas

Come hai scoperto, risoluzione esplicita gli permette di trovare il nome. C'è un ulteriore avvertimento su questo che è anche un errore del compilatore (la risoluzione dei nomi non richiede l'accesso a questo, anche se posso vedere come l'implementazione di un compilatore potrebbe richiederlo) - si tratta comunque di un bug separato. Microsoft ha confermato che si tratta di un bug e apparentemente ha preparato una correzione per la prossima versione.

2

Quanto segue compila bene. Mi sembra che questo deve essere solo un bug VS con i modelli.

struct Foo { 
    static void foo() {} 
    void bar() { 
     auto f = []() { foo(); }; 
     f(); 
    } 
}; 
+0

Che compilatore hai provato? Sembra che il risultato vari a seconda del compilatore, quindi è importante conoscere il comportamento standard conforme. –

+0

@Gene: VC++ 2010 implementato lambdas pre [N2927] (http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2009/n2927.pdf), quindi è ** not * * conforme alla dicitura FDIS. – ildjarn

Problemi correlati