¿Los compiladores de C ++ realizan optimizaciones en tiempo de compilación en los cierres lambda?

Supongamos que tenemos el siguiente código (sin sentido):

const int a = 0;
int c = 0;
for(int b = 0; b < 10000000; b++)
{
    if(a) c++;
    c += 7;
}

La variable 'a' es igual a cero, por lo que el compilador puede deducir en tiempo de compilación que la instrucción 'if (a) c ++;' nunca se ejecutará y lo optimizará.

Mi pregunta:¿Sucede lo mismo con los cierres lambda?

Mira otra pieza de código:

const int a = 0;
function<int()> lambda = [a]()
{
    int c = 0;
    for(int b = 0; b < 10000000; b++)
    {
        if(a) c++;
        c += 7;
    }
    return c;
}

¿Sabrá el compilador que 'a' es 0 y optimizará la lambda?

Ejemplo aún más sofisticado:

function<int()> generate_lambda(const int a)
{
    return [a]()
    {
        int c = 0;
        for(int b = 0; b < 10000000; b++)
        {
            if(a) c++;
            c += 7;
        }
        return c;
    };
}

function<int()> a_is_zero = generate_lambda(0);
function<int()> a_is_one = generate_lambda(1);

¿El compilador será lo suficientemente inteligente como para optimizar la primera lambda cuando sepa que 'a' es 0 en el momento de la generación?

¿Tiene gcc o llvm este tipo de optimizaciones?

Lo pregunto porque me pregunto si debería hacer tales optimizaciones manualmente cuando sé que ciertas suposiciones se cumplen en el tiempo de generación lambda o el compilador lo hará por mí.

Respuestas a la pregunta(2)

Su respuesta a la pregunta