2013-04-02 14 views
13

Stranamente, GCC 4.7.2 sembra non avere alcun problema con il seguente codice:Estensione GCC C++ 11 non documentata? Catturare espressioni arbitrarie nella cattura lambda elenca

template<typename T> 
T&& identity(T&& x1) { 
    return std::forward<T>(x1); 
} 

int main(int, char**) { 
    int x1 = 1; 
    int &x2 = identity(x1); 
    auto f = [&x1]() mutable { 
     x1 = x1 + 1; 
    }; 
    auto g1 = [y=x2+1]() { 
     static_assert(std::is_same<decltype(y), const int>::value, "fail"); 
     std::cout << "g1: " << y << std::endl; 
    }; 
    auto h1 = [y=identity(x1)+1]() { 
     static_assert(std::is_same<decltype(y), const int>::value, "fail"); 
     std::cout << "h1: " << y << std::endl; 
    }; 
    auto g2 = [&y=x2]() { 
     static_assert(std::is_same<decltype(y), int&>::value, "fail"); 
     std::cout << "g2: " << y << std::endl; 
    }; 
    auto h2 = [&y=identity(x1)]() { 
     static_assert(std::is_same<decltype(y), int&>::value, "fail"); 
     std::cout << "h2: " << y << std::endl; 
    }; 
    f(); g1(); h1(); g2(); h2(); 
    f(); g1(); h1(); g2(); h2(); 
    return 0; 
} 

I risultati sono i seguenti:

g1: 2 
h1: 2 
g2: 2 
h2: 2 
g1: 2 
h1: 2 
g2: 3 
h2: 3 

non posso sembra trovare alcuna menzione di acquisizione di espressioni arbitrarie nelle liste di cattura lambda, anche in n3285 (datato 2012-10-02). Inoltre, non riesco a trovare alcuna documentazione di questo come un'estensione GCC ufficiale da nessuna parte.

È questo un'estensione non documentata GCC (alla VLAs as structure members, una proposta di/imminente C++ caratteristica che GCC è andato avanti e implementato presto, nessuno dei due, entrambi, o che cosa?

+1

C'è una [proposta] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3610.html) per qualcosa di simile. –

+0

@JohnSchug oh, ma è datato 2013-03-15! Quindi la risposta è "entrambi"? (dal momento che questo sembra essere precedente alla proposta?) –

+0

(Inoltre non sembra menzionare l'implementazione GCC, quindi potrebbe essere sviluppato completamente indipendentemente da questo.) –

risposta

5

Come notato nei commenti, la funzione è molto simile a una recente proposta, ma è stata implementata molto prima della standardizzazione iniziale.GCC è servito come prototipo durante lo sviluppo standard e inizialmente riflette le idee che gli autori hanno gradito, che sono state successivamente perfezionate. Alcune idee che dovevano essere tagliate per mantenere lo standard ragionevolmente le semplici sono reintrodotte come proposte: Lambdas ha molto spazio per crescere

Per ora, questo è solo un altro g. Non è mai stato rimosso dall'implementazione originale perché nessuno lo ha ancora segnalato.


Aggiornamento: Questa è ora una caratteristica standard dal C++ 14.

Problemi correlati