2016-06-03 2 views
1

Рассмотрим следующий код: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() { } 

Какой компилятор является правильным?

+1

Версия? Флаги? – Columbo

+0

C++ 17 говорит: 'return (v^...^V);' :-) –

+0

Я бы подумал, что это может быть потому, что^= присваивает значение v. Но опять же, это может быть разрешено при компиляции время. –

ответ

1

Как уже упоминалось here, это ошибка в звоне:

the bug is something odd about the left-hand side of a comma operator

Подтвержденная и фиксировано.