Подтвердить что ты не робот

Инициализация constexpr с помощью const, - int vs float

Мне интересно, почему целое число ii инициализируется во время компиляции, но не float ff здесь:

int main() {
  const int i = 1;
  constexpr int ii = i;

  const float f = 1.0;
  constexpr float ff = f;
 }

Это то, что происходит, когда я пытаюсь скомпилировать:

> g++ -std=c++11 test.cc
test.cc: In function ‘int main()’:
test.cc:6:24: error: the value of ‘f’ is not usable in a constant expression
   constexpr float ff = f;
                        ^
test.cc:5:15: note: ‘f’ was not declared ‘constexpr’
   const float f = 1.0;
4b9b3361

Ответ 1

Постоянные переменные интегральных типов с постоянными инициализаторами являются интегральными постоянными выражениями (де-факто неявно constexpr, см. expr.const в ISO С++). float не является интегральным типом и не отвечает требованиям для постоянного выражения без использования constexpr. (Аналогичный случай, почему int может быть, но float не может быть параметром шаблона.)

Ответ 2

В константах С++ константы обрабатываются иначе, чем другие константные типы. Если они инициализируются выражением постоянной времени компиляции, они могут использоваться в выражении времени компиляции. Это было сделано так, чтобы размер массива мог быть const int вместо #define d (например, вы были вынуждены в C):

(не допускайте расширения VLA)

const int s = 10;
int a[s];          // OK in C++