Skip to the content.

const и constexpr (С++11)


В яп С++ есть два вида констант:

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

Соответственно, компилятору необходимо постоянно отслеживать вид констант, чтобы упростить это задание, в С++11 был добавлен constexpr, который сообщает компилятору, что текущая переменная - константа времени компиляции.

constexpr double gravity = 9.8; // времени компиляции
constexpr int sum = 4 + 5; // времени компиляции

int age;
std::cin >> age;
const int my_age = age; // runtime

#define vs const


#define const\constexpr
Имеет глобальную область видимости Любая область видимости
Макросы не заменяются во время отладки Легче в отладке
Занимается препроцессор Занимается компилятор
На макрос нельзя создать указатель На константу можно создать указатель
  Может быть type checked

Стоит обратить внимание, что речь идет только о константах, использовать директивы условной компиляции все так же полезно: #ifdef #if.