В чём разница между 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 позволяет заниматься метапрограммированием на этапе компиляции, как альтернативная возможность для шаблонного метапрограммирования.
Комментариев нет:
Отправить комментарий