Почему gcc5.4 не компилирует функцию constexpr, вызывающую функцию non-constexpr, а icpc делает? - PullRequest
0 голосов
/ 23 января 2019

gcc5.4 не компилирует следующий код:

// source.cpp
int nonconstexprfunc()
{
    return 14;
}

constexpr int func(int n)
{
    if (n < 0)
        return nonconstexprfunc();
    return n*n;
}

int main()
{
    constexpr int t1 = func(0);
    return 0;
}

Используемая мной команда:

$ g++ -std=c++14 -c source.cpp

Выход:

In function ‘constexpr int func(int)’:
error: ‘constexpr int func(int)’ called in a constant expression
constexpr int t1 = func(0);
In function ‘int main()’:
error: ‘constexpr int func(int)’ called in a constant expression
constexpr int t1 = func(0);

Но я могу скомпилировать этот source.cpp, используя gcc6.4. Разве gcc5.4 не полностью поддерживает функции constexpr?

Что еще интереснее, я могу скомпилировать этот source.cpp с помощью icpc (компилятор Intel C ++), который использует gcc5.4 - я полагаю, должна быть опция для компиляции этого кода с использованием gcc5.4.

$  icpc -v
icpc version 19.0 (gcc version 5.4.0 compatibility)
$  icpc -std=c++14 -c source.cpp
no errors

1 Ответ

0 голосов
/ 23 января 2019

Первое ограничение касается использования gcc 5.4 с -std = c ++ 11, которое выдает ошибку из-за двух операторов возврата, см. Тело функции constexpr, а не оператор возврата , поэтому чтобы снять первую проблему, вам нужно использовать -std = c ++ 14

Затем получается

'# 1 с x86-64 gcc 5.4 : В функции 'constexpr int func (int)':

: 10: 32: ошибка: вызов функции non-constexpr 'int nonconstexprfunc ()

     return nonconstexprfunc();        ^

: в функции 'int main ()':

: 16: 28: ошибка: 'constexpr int func (int)' вызван в константе выражение

 constexpr int t1 = func(0);

                         Compiler returned: 1

Следующая следующая ошибка - известная ошибка GCC (неверная интерпретация c ++ 14), см.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86678
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67026

Вы также можете проверить вызов функции non constexpr из constexpr, разрешенной в некоторых условиях

Однако, судя по ошибке, она выдает:

Кажется довольно очевидным, что делать

constexpr int nonconstexprfunc()
{
    return 14;
}

исправит ошибку и будет более эффективной в вашем случае.
Проверьте разницу с https://www.godbolt.org/, например, добавив constexpr или не используя gcc 8.2.

...