Я новичок в программировании, и я начал узнавать об этом, используя книгу Принципы программирования и практику с использованием С++. Сегодня я здесь, потому что у меня есть некоторые проблемы в понимании функций constexpr
. В главе 8 автор вводит их в некоторые строки и краткий пример, используя эти слова:
Функция представляет собой вычисление, и иногда мы хотим сделать расчет во время компиляции. Причина, по которой требуется вычисление, вычисляемое компилятором, обычно заключается в том, чтобы избежать того же вычисления, выполненного миллионы раз во время выполнения.
Мы сообщаем, что будем иметь функцию, оцененную во время компиляции, объявив функцию как функцию
constexpr
. Функцияconstepxr
может быть оценена во время компиляции, только если ей заданы постоянные выражения в качестве аргументов.constexpr double xscale = 10; // scaling factors constexpr double yscale = 0.8; constexpr Point scale(Point p) { return { xscale*p.x, yscale*p.y }; };
Предположим, что точка - это простая структура с элементами x и y, представляющими двумерные координаты. Теперь, когда мы даем аргумент
scale()
aPoint
, он возвращает точку с координатами, масштабированными в соответствии с факторамиxscale
иyscale
. Например:void user(Point p1) { Point p2{10,10}; Point p3 = scale(p1); Point p4 = scale(p2) // p4 == {100,8} constexpr Point p5 = scale(p1); // error : scale(p1) is not a constant expression constexpr Point p6 = scale(p2); // p6 == {100,8};
Мой вопрос: Почему мы можем использовать p2
в качестве аргумента для scale()
? Является ли p2
постоянным выражением? И если да, то почему?
Можно ли считать элементы данных x
и y
постоянными выражениями?
Моя книга не дает слишком много информации, поэтому у меня возникают некоторые проблемы с этой концепцией.