C ++: Uma captura explícita de lambda não utilizada pode ser otimizada?
Eu tenho uma quantidade decente de código que depende da captura de umshared_from_this()
ao usar uma expressão lambda como um retorno de chamada para garantir que minha instância permaneça ativa:
std::shared_ptr<Thing> self = shared_from_this();
auto doSomething = [this, self] ()
{
// various statements, none of which reference self, but do use this
}
Então a questão é: desde que eu não estou fazendo referênciaself
dentro do corpo lambda, um compilador em conformidade pode otimizar a captura?
Considere o seguinte 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;
}
A saída é:
1
2
Isso indica queg++-4.7.1
não otimiza a captura de distância (nemclang-3.1
).