У меня была в моей библиотеке C++ 11 функция constexpr
, которая суммирует символы в строке. Затем я попытался обновить эту функцию более естественный стиль в C++ 14, и столкнулся с проблемой:ошибка оптимизации constexpr в gcc6.x?
constexpr long sumchars11(const char s[], int pos = 0){
return 0 + (s[pos] ? (s[pos] + sumchars11(s, pos+1)) : 0);
}
constexpr long sumchars14(const char s[]){
int pos = 0;
long sum = 0;
while(s[pos]) {
sum += s[pos++];
}
return sum;
}
int main() {
static_assert(sumchars11("1235") == 203, "!"); // ok
static_assert(sumchars14("1235") == 203, "!"); // error on gcc 6.x
// ok on clang
}
Если изменить тело sumchars14
от:
sum += s[pos++];
на первый взгляд эквивалент:
sum += s[pos];
++pos;
static_assert
больше не срабатывает. Что дает? Могу ли я использовать пост-прирост в функциях constexpr
?
Это похоже на ошибку компилятора. –
Я так и думаю, но перед тем, как отправить его, я подумал, что некоторые дополнительные пары глаз будут полезны - вы никогда не знаете, когда у вас есть один из этих «дох !!!». моменты! – frasnian
Это не сложно. 'sum + = s [pos ++];' логически эквивалентно 'sum + = s [pos]; ++ pos; ', и нет никакой неоднозначности секвенирования. Время обернуть его. Время для загрузки ошибки bugzilla. –