在C++中,存在编译时(compile-time)和链接时(link-time)常量性。
const变量是一个在初始化之后无法修改的对象。但const并不总是保证值在编译时已知;它可能只能在运行时计算。constexpr保证表达式或函数将在编译时计算。示例:
const int x = time(0); // const,但不是constexpr:值在运行时计算 constexpr int y = 2 + 2; // constexpr:在编译时已知 constexpr int square(int x) { return x * x; } int arr[square(3)]; // 数组大小是编译时表达式
对于需要在编译器中可用的常量表达式,例如数组的大小或模板参数,请使用constexpr。
声明为constexpr的函数可以用非常量参数调用吗?
回答: 可以!如果参数在编译时已知,结果将在编译时计算。如果参数只能在运行时确定,函数将像普通函数一样计算。
constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // 在运行时调用
故事
其中一个模块通过
const int设置数组的大小,以为这是编译时常量。在另一种编译器上导致了错误,因为值是在运行时计算的,数组的大小不符合标准。
故事
在哈希计算中,编译器无法优化计算,因为使用了
const变量而不是constexpr。结果:在新的版本中性能下降超过2倍。
故事
在迁移到现代标准时混淆了关键字,将函数声明为
const而不是constexpr,导致无法在编译时表达式的模板中使用结果。快速诊断显示了错误,但在审查时被合并到了主分支中。