下面是一些代码:
constexpr int sum(int a, int b) {
return a + b;
}
int main() {
int a = sum(4, 5);
return 0;
}我用clang-9编译了这段代码,但它在编译时不会计算main函数中int a的值。如果我使用constexpr int a,clang会在编译时计算它,但我不能在运行时更改这个变量。
但是gcc-7.1在编译时计算int a的值。
为什么会发生这种情况?如何修复它?
发布于 2019-04-29 17:08:39
constexpr说明符仅意味着可以在编译时计算函数的值。这并不意味着应该在编译时对其进行计算。因此,不同的编译器/版本在这方面具有灵活性。
如果您想在编译时强制执行这样的计算,那么分配给它的变量也应该是constexpr。
当a为constexpr int而不仅仅是一个普通的int时,就会发生这种情况。
要解决您的特定问题,您应该使用一个中间变量constexpr,然后将其值赋给一个可以更改的变量。
发布于 2019-04-29 17:06:51
如果您希望在编译时预先计算一个值,然后将其绑定到允许修改的标识符,则只能通过使用constexpr对象初始化非constexpr对象来强制执行此操作:
constexpr int init = sum(4, 5);
int a = init;https://stackoverflow.com/questions/55899941
复制相似问题