Если я что-то упустил, gcc и clang здесь верны.

ющий код принят GCC 7.2 и clang 5.0.0, но отклонен Microsoft VS 2017 15.5.0 Preview 5 и компилятором 19 Intel C ++:

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

Если я заменюf(x) с участиемf(decltype(x){})И Microsoft, и Intel не жалуются. Я это понимаюx не является константным выражением, но оно не используется внутриf, Вероятно, поэтому GCC и Clang не жалуются.

Я думаю, что компиляторы Microsoft и Intel правы, отвергая этот код. Как вы думаете?

Ответы на вопрос(2)

Ваш ответ на вопрос