constexpr的按位运算会导致constexpr吗?

时间:2018-06-09 14:04:23

标签: c++11 constexpr

我以下面显示的方式定义了一些常量

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

我的问题是编译器是否将所有仅使用ab的算术和按位运算视为constexpr

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

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

1 个答案:

答案 0 :(得分:2)

  

我的问题是编译器是否将所有仅使用ab的算术和按位运算视为constexpr

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

  

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

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

  

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

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

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