В чем отличие #define от constexpr?
Есть две константы:
#define a 5
И
constexpr int a = 5;
Как я понимаю, все a будут заменены на 5 компилятором без создания переменных. Верно?
#define - это тупая подстановка '5' в исходный код программы: везде, где встретится 'a'. Без какого-либо контроля и до начала собственно компиляции.
constexpr использовать таким образом несколько странно. Обычно для такого используется const. А constexpr используется для функций и указывает компилятору, что везде, где только возможно, значение функции должно быть вычислено на этапе компиляции и подставлено в выражение в месте вызова функции.
Но в любом случае, компилятор сначала проверит, что объявленный тип значения допустим в месте его использования. И если недопустим - выдаст вменяемое сообщение об ошибке.