ultima gnuc compiler compilador c++ lambda c++17 c++-faq

gnuc - C++ 17 lambda captura*esto



gnu g++ compiler (2)

C ++ 17 agregará la captura de copia de este objeto por valor, con una especificación de captura de [*this] .

¿Cómo es esto útil? ¿En qué se diferencia de capturar this ? ¿No se puede lograr esto en C ++ 14 con [tmp = *this] ?

Bonificación por explicar por qué P0018R3 usa [=, tmp = *this] lugar de [tmp = *this] en su ejemplo. Si hubieran utilizado [tmp = *this] , se eliminarían todos los inconvenientes enumerados de la solución C ++ 14.


¿Cómo es útil? Es útil cuando necesita una copia de *this - por ejemplo, cuando *this ya no es válido para cuando se evalúa la lambda.

¿En qué se diferencia de capturar this ? Hace una copia del objeto, de modo que cuando se evalúa la lambda, this puntero se refiere a la copia, en lugar de al objeto original.

¿Se puede lograr en C ++ 14 con [tmp = *this] ? Puede, pero [*this] es más conveniente, ya que el código se puede mover sin prefijar el acceso de miembros con tmp. . De lo contrario, especialmente con [=, tmp = *this] , es posible referirse accidentalmente a los miembros del objeto original cuando quiso referirse a la copia (especialmente si tiene la costumbre de cortar + pegar programación). [=,*this] es una alternativa más segura en este caso, ya que el original no es accesible.


Imagine que *this es una clase de identificador, que mantiene un shared_ptr a algún estado compartido.

La implementación compartida es (por ejemplo) una máquina de estado de controlador de protocolo.

La clase de identificador se pasa a través de una serie de manejadores asíncronos, por lo que debe poder copiarse. Cada controlador muta el estado compartido.

Un caso de uso sólido para esto podría ser un controlador de protocolo para su uso con un servicio asio personalizado (por ejemplo, un http_protocol_socket ).

[=, tmp = *this] capturará de forma promiscua cualquier variable por valor, incluido, de forma bastante peligrosa, el puntero de this , y capturará específicamente *this en tmp .

En este caso de uso, sería peligroso referirse inadvertidamente a this en el controlador asíncrono, ya que es probable que sea un puntero colgante. Este es un error esperando a suceder.

[tmp=*this] solo capturará *this .