que tienen una buena cantidad de código que se basa en la captura de un shared_from_this()
cuando se utiliza una expresión lambda como llamada de retorno para asegurar que mi caso se mantiene vivo:C++: ¿Se puede optimizar una captura explícita de lambda no utilizada?
std::shared_ptr<Thing> self = shared_from_this();
auto doSomething = [this, self]()
{
// various statements, none of which reference self, but do use this
}
Así que la pregunta es: ya que no soy referenciando self
en el interior el cuerpo lambda, ¿es un compilador compatible que permite optimizar la captura de distancia?
Considere el siguiente programa:
#include <functional>
#include <iostream>
#include <memory>
std::function<void()> gFunc;
struct S : std::enable_shared_from_this<S>
{
void putGlobal()
{
auto self = shared_from_this();
gFunc = [self] { };
}
};
int main()
{
auto x = std::make_shared<S>();
std::cout << x.use_count() << std::endl;
x->putGlobal();
std::cout << x.use_count() << std::endl;
}
la salida es:
1
2
Esto indica que g++-4.7.1
no optimiza la captura de distancia (ni tampoco clang-3.1
).
Esto parece contradecir [esta respuesta] (http://stackoverflow.com/questions/6181464/c11-lambda-capture-semantics), que dice que si no se usa ODR entonces no se captura realmente. – GManNickG
@GManNickG: La diferencia es la captura implícita ('[=]') y * explícita * captura ('[someNameHere]'). La captura implícita requiere elementos usados ODR. La captura explícita no. –
@NicolBolas: Gotcha. Una entidad se captura implícitamente si y solo si se usa ODR. En ese punto, está en el mismo bote que las entidades capturadas explícitamente. Gracias. – GManNickG