2016-03-23 4 views
5

Si consideri il seguente, ad esempio minimo:Acquisizione lambda: per utilizzare l'inizializzatore o non usarlo?

int main() { 
    int x = 10;  
    auto f1 = [x](){ }; 
    auto f2 = [x = x](){}; 
} 

che ho visto più di una volta un tale uso del inizializzatore [x = x], ma non riesco a comprendere appieno e perché dovrei usarlo al posto del [x].
posso ottenere il significato di qualcosa come [&x = x] o [x = x + 1] (come mostrato nella documentation e perché diverso dal [x], naturalmente, ma ancora non riesco a capire le differenze tra le lambda nell'esempio.

sono completamente intercambiabili o c'è alcuna differenza non riesco a vedere

+2

importa se l'originale ' x' è 'const'. –

+0

Lo cattura per copia in entrambi i casi? – skypjack

+0

@skypjack: Nel caso '[x = ...]', 'x' può essere copiato o spostato-inizializzato - dipende dall'espressione del lato destro. Per '[x = x]' in particolare, vale a dire copia-inizializzazione, sì. – ildjarn

risposta

8

ci sono diversi casi d'angolo che bolle più o meno fino a? "[x = x] decade; [x] non lo fa".

  • catturare un riferimento alla funzione:

    void (&f)() = /* ...*/; 
    [f]{};  // the lambda stores a reference to function. 
    [f = f]{}; // the lambda stores a function pointer 
    
  • catturare un array:

    int a[2]={}; 
    [a]{}  // the lambda stores an array of two ints, copied from 'a' 
    [a = a]{} // the lambda stores an int* 
    
  • acquisizione di un cv-qualificato cosa:

    const int i = 0; 
    [i]() mutable { i = 1; } // error; the data member is of type const int 
    [i = i]() mutable { i = 1; } // OK; the data member's type is int 
    
+0

Quindi, come hai detto nel commento - * Importa se l'originale 'x' è' const' *. Gli altri casi non sembrano davvero interessanti. Grazie. – skypjack