Poniższy kod jest akceptowany przez GCC 7.2 oraz brzękiem 5.0.0, ale zostaje odrzucony przez Microsoft VS 2017 15.5.0 Podgląd 5 i Intel C++ 19:Generic lambda i jej argument jako stałej ekspresji
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);
^
Gdybym zastąpić f(x)
z f(decltype(x){})
, zarówno Microsoft, jak i Intel nie narzekają. Rozumiem, że x
nie jest wyrażeniem stałym, ale nie jest używane wewnątrz f
. Prawdopodobnie dlatego GCC i klang nie narzekają.
Podejrzewam, że kompilatory Microsoft i Intel mają rację, odrzucając ten kod. Co myślisz?
@RichardHodges, '-std = C++ 14'. – Evgeny
OK, teraz myślę, że jest to błąd gcc i clanga, ponieważ C++ 14 nie ma konstelpr lambda ... to jest dostępne od C++ 17 –
@WF, lambda celowo nie jest "constexpr" (w prawdziwy kod to nie jest). – Evgeny