我以下面显示的方式定义了一些常量
constexpr int a = 1;
constexpr int b = 2;
我的问题是编译器是否将所有仅使用a
和b
的算术和按位运算视为constexpr
?
例如,我想知道编译器是否可以保证计算c
编译时的表达式?如果没有,有没有办法要求编译时计算?
c = (a + b) & (a | b);
答案 0 :(得分:2)
我的问题是编译器是否将所有仅使用
a
和b
的算术和按位运算视为constexpr
?
这样的表达式可以在constexpr
上下文中使用,但有一些例外(必须避免任何导致未定义或实现定义的行为的行为,例如负数量的按位右移,除零,溢出签名类型)。
例如,我想知道编译器是否可以保证计算c编译时的表达式?
仅当表达式用于需要编译时上下文的上下文时。
如果没有,有没有办法要求编译时计算?
应用于变量的constexpr
关键字就是这样。假设您不能仅将限定符添加到c
本身,因为它被用作变量(例如,稍后根据运行时数据重新分配),您仍然可以强制计算为constexpr
:< / p>
constexpr auto cvalue = (a + b) & (a | b);
c = cvalue;