C ++: Czy nieużywane jawne przechwytywanie lambda może zostać zoptymalizowane?

Mam przyzwoitą ilość kodu, który polega na przechwytywaniushared_from_this() gdy używamy wyrażenia lambda jako wywołania zwrotnego, aby zapewnić, że moja instancja pozostanie aktywna:

std::shared_ptr<Thing> self = shared_from_this();
auto doSomething = [this, self] ()
{
    // various statements, none of which reference self, but do use this
}

Więc pytanie brzmi: ponieważ nie odwołuję sięself wewnątrz ciała lambda, czy zgodny kompilator pozwala zoptymalizować przechwytywanie?

Rozważmy następujący program:

#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;
}

Dane wyjściowe to:

1
2

To wskazuje, żeg++-4.7.1 nie optymalizuje przechwytywania (ani tego nie robi)clang-3.1).

questionAnswers(1)

yourAnswerToTheQuestion