Lambda genérico e seu argumento como expressão constante

O código a seguir é aceito pelo GCC 7.2 e clang 5.0.0, mas é rejeitado pelo Microsoft VS 2017 15.5.0 Preview 5 e pelo compilador Intel C ++ 19:

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);
                        ^

Se eu substituirf(x) comf(decltype(x){}), a Microsoft e a Intel não reclamam. Eu entendi aquilox não é uma expressão constante, mas não é usada dentrof. Provavelmente é por isso que o GCC e o clang não reclamam.

Eu acho que os compiladores da Microsoft e da Intel estão corretos ao rejeitar esse código. O que você acha?

questionAnswers(2)

yourAnswerToTheQuestion