Простая демонстрация различия двух переменных:
struct Debug {
constexpr Debug(bool a, bool b, bool c) : a(a), b(b), c(c) {}
bool a, b, c;
constexpr bool get() const { return a; }
};
int main() {
Debug dbg(true, false, false); // dbg is not a constant
constexpr Debug dbg2(0, 0, 0); // constexpr makes this a constant expression
// *** Begin demo ***
dbg.a = false;
//dbg2.a = false; //< error: assignment of member 'Debug::a' in read-only object
// *** End demo ***
}
Значение dbg
можно изменить, а значение dbg2
нельзя.
Чтобы получить объект Debug
, который является константным выражением, вам нужен как квалификатор constexpr
в конструкторе (чтобы позволить объекту Debug
помечаться как константное выражение), так и квалификатор constexpr
в объявление переменной (чтобы пометить этот объект как константное выражение).