Lambda genérica y su argumento como expresión constante

GCC 7.2 y clang 5.0.0 aceptan el siguiente código, pero Microsoft VS 2017 15.5.0 Preview 5 y el compilador Intel C ++ 19 lo rechazan:

struct S { };

constexpr int f(S)
{
    return 0;
}

int main()
{
    auto lambda = [](auto x)
    {
        constexpr int e = f(x);
    };

    lambda(S{});
}

Microsoft:

<source>(12): error C2131: expression did not evaluate to a constant

Intel:

<source>(12): error: expression must have a constant value
    constexpr int e = f(x);
                      ^
<source>(12): note: the value of parameter "x" (declared at line 10) cannot be used as a constant
    constexpr int e = f(x);
                        ^

Si reemplazof(x) conf(decltype(x){}), tanto Microsoft como Intel no se quejan. Entiendo quex no es una expresión constante, pero no se usa dentrof. Esta es probablemente la razón por la cual GCC y clang no se quejan.

Supongo que los compiladores de Microsoft e Intel tienen razón al rechazar este código. ¿Qué piensas?

Respuestas a la pregunta(2)

Su respuesta a la pregunta