首页 > 解决方案 > constexpr 的按位运算会导致 constexpr 吗?

问题描述

我以如下所示的方式定义了一些常量

constexpr int a = 1;
constexpr int b = 2;

我的问题是是否所有仅使用并将被编译器视为的算术和按a位运算bconstexpr

例如,我想知道编译器是否保证计算c编译时的表达式?如果没有,有没有办法要求编译时间计算?

c = (a + b) & (a | b);

标签: c++c++11constexpr

解决方案


我的问题是是否所有仅使用并将被编译器视为的算术和按a位运算bconstexpr

这样的表达式可以在constexpr上下文中使用,但有一些例外(必须避免任何导致未定义或实现定义的行为,例如负数的按位右移、除以零、有符号类型的溢出)。

例如,我想知道编译器是否保证计算 c 编译时间的表达式?

仅当在需要编译时上下文的上下文中使用表达式时。

如果没有,有没有办法要求编译时间计算?

这就是constexpr应用于变量的关键字的作用。假设您不能只将限定符添加到c自身,因为它被用作变量(例如,稍后根据运行时数据重新分配),您仍然可以强制计算为constexpr

constexpr auto cvalue = (a + b) & (a | b);
c = cvalue;

推荐阅读