В результате побитовые операции constexpr приводят к constexpr? - PullRequest
0 голосов
/ 09 июня 2018

Я определил несколько констант способом, показанным ниже

constexpr int a = 1;
constexpr int b = 2;

Мой вопрос заключается в том, будут ли все арифметические и побитовые операции, которые используют только a и b, рассматриваться как constexprcompiler?

Например, мне интересно, гарантированно ли компилятор вычислит выражение для c времени компиляции?Если нет, есть ли способ запросить расчеты времени компиляции?

c = (a + b) & (a | b);

1 Ответ

0 голосов
/ 09 июня 2018

У меня вопрос: все ли арифметические и побитовые операции, которые используют только a и b, будут рассматриваться компилятором как constexpr?

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

Например, мне интересно, гарантированно ли компилятор вычислит выражение для времени компиляции c?

Только если выражение используется в контексте, где требуется контекст времени компиляции.

Если нет, есть ли способ запросить расчеты времени компиляции?

Это то, что будет делать ключевое слово constexpr, примененное к переменной.Предполагая, что вы не можете просто добавить квалификатор к c, потому что он используется как переменная (например, переназначен позже на основе данных времени выполнения), вы все равно можете заставить вычисление constexpr:

constexpr auto cvalue = (a + b) & (a | b);
c = cvalue;
...