Clang не оценивает значение функции constexpr для переменной non-constexpr во время компиляции - PullRequest
5 голосов
/ 29 апреля 2019

Некоторый код:

constexpr int sum(int a, int b) {
    return a + b;
}

int main() {
    int a = sum(4, 5);

    return 0;
}

Я компилирую этот код с помощью clang-9, но он не оценивает значение int a в основной функции во время компиляции.Если я использую constexpr int a, clang оценивает его во время компиляции, но я не могу изменить эту переменную во время выполнения.

Но gcc-7.1 оценивает значение int a во время компиляции.

Почему это происходит?Как это исправить?

Ответы [ 2 ]

5 голосов
/ 29 апреля 2019
Спецификатор

constexpr означает только то, что можно оценить значение функции во время компиляции.Это не означает, что он должен оцениваться во время компиляции.Таким образом, различные компиляторы / версии имеют гибкость в этом вопросе.

Если вы хотите применить такую ​​оценку во время компиляции, тогда переменной, которой она назначена, также должно быть constexpr.

Это происходиткогда a равно constexpr int, а не просто int.

Чтобы исправить вашу конкретную проблему, вы должны использовать промежуточную переменную, равную constexpr, а затем присвоить ее значение переменной, которая можетбыть изменены.

5 голосов
/ 29 апреля 2019

Если вы хотите, чтобы значение было предварительно вычислено во время компиляции, но затем привязано к идентификатору, который допускает изменение, вы можете принудительно принудительно установить это значение, только если инициализировать не constexpr объект с constexpr объектом:

constexpr int init = sum(4, 5);
int a = init;
...