Рассмотрим следующий код:GCC и лязг: Подвыражение не действует в постоянном выражении
template<int... V>
static constexpr int f(int v) {
int a[] = { (v ^= V, 0)... }; // Line 3
return v;
}
static constexpr int i = f<0x00>(0x11); // Line 7
int main() { }
Он компилируется с GCC и не компилировать с грохотом со следующей ошибкой:
main.cpp:7:22: error: constexpr variable 'i' must be initialized by a constant expression
[...]
main.cpp:3:23: note: subexpression not valid in a constant expression
Заметим, что это не зависит от того, что я использую функцию шаблона.
Другими словами, ни код выше, ни один ниже компилировать с лязгом:
static constexpr int mix(int v, int u) {
int a[] = { (v ^= u, 0) };
return v;
}
static constexpr int mf = mix(0x11, 0x00);
int main() { }
Какой компилятор является правильным?
Версия? Флаги? – Columbo
C++ 17 говорит: 'return (v^...^V);' :-) –
Я бы подумал, что это может быть потому, что^= присваивает значение v. Но опять же, это может быть разрешено при компиляции время. –