Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Разница между const и constexpr

В чём разница между const int x и constexpr int x? Что из этого стоит использовать?


Ответ

Самый простой пример. Данная программа компилируется
#include
struct A { constexpr static double x = 10.0; };
int main() { A a;
return 0; }
А данная программа нет.
#include
struct A { const static double x = 10.0; };
int main() { A a;
return 0; }
Существенное значение также имеет место, когда этот спецификатор, constexpr, используется для функций.
Как вы знаете, только функции-члены класса могут иметь квалификатор const, который имеет отношение к объекту, для которого вызывается данная функция-член класса.
Обычные функции не могут быть константными.
Спецификатор constexpr введен для того, чтобы заставить компилятор на этапе кмпиляции создавать объекты и использовать их как константы времени компиляции.
Например, известно, что стандарт C++ для задания размерности массива требует константное выражение. Используя спецификатор constexpr вы можете задавать размер массива, используя некоторые функции. Например,
#include
struct A { constexpr A( bool b ) : n( b ? 5 : 10 ) {} size_t n; };
int main() { int a[A( true ).n]; int b[A( false ).n];
int i = 0; for ( int &x : a ) x = i++;
i = 0; for ( int &x : b ) x = i++;
for ( int x : a ) std::cout << x << ' '; std::cout << std::endl;
for ( int x : b ) std::cout << x << ' '; std::cout << std::endl;
return 0; }
Вывод программы на консоль
0 1 2 3 4 0 1 2 3 4 5 6 7 8 9
Использование constexpr позволяет заниматься метапрограммированием на этапе компиляции, как альтернативная возможность для шаблонного метапрограммирования.

Комментариев нет:

Отправить комментарий