2016-12-14 3 views
2

У меня была в моей библиотеке 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?

+0

Это похоже на ошибку компилятора. –

+0

Я так и думаю, но перед тем, как отправить его, я подумал, что некоторые дополнительные пары глаз будут полезны - вы никогда не знаете, когда у вас есть один из этих «дох !!!». моменты! – frasnian

+0

Это не сложно. 'sum + = s [pos ++];' логически эквивалентно 'sum + = s [pos]; ++ pos; ', и нет никакой неоднозначности секвенирования. Время обернуть его. Время для загрузки ошибки bugzilla. –

ответ

1

Как вы и ожидали, функция, которую у вас есть, прекрасна. В C++ 14 нет правил для constexpr, которые запретили бы определенную форму, которую вы выбрали, но позволили вам использовать все различные логически эквивалентные версии, с которыми вы пытались найти успех.

Это gcc bug 77553, и было разрешено в gcc 6.3.

Смежные вопросы