#cpp #cpp11 #const
В чём разница между const int x и constexpr int x? Что из этого стоит использовать?
Ответы
Ответ 1
Самый простой пример. Данная программа компилируется #includestruct 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 позволяет заниматься метапрограммированием на этапе компиляции, как альтернативная возможность для шаблонного метапрограммирования. Ответ 2
const int x - переменная x не должна меняться в процессе работы программы, а constexpr int x - оно еще и должна получить свое значение во время компиляции... Например, int n; cin >> n; const int x = n*n; Отработает, x получит свое значение, которое нельзя будет менять - но получит во время работы программы. Если написать constexpr - не скомпилируется, ибо во время компиляции x не известно. Соответственно этому - используйте то, что боее подходит для ваших целей. Где можно - лучше constexpr, где нет - просто const.
Комментариев нет:
Отправить комментарий