考虑以下代码片段:
int main(){
constexpr int x = -1;
if(x >= 0){
constexpr int y = 1<<x;
}
}
GCC 7(可能还有 GCC 的其他版本)拒绝编译这个并说:
error: right operand of shift expression '(1 << -1)' is negative [-fpermissive]
我可以猜测这可能来自哪里:constexpr
声明于y
让 GCC 评估y
在编译时,它可能是负数。删除constexpr
修复错误。
然而,这是标准未定义的行为吗?条件始终为假,因此值y
永远不会被使用。
在我的实际代码中,x
是一个模板参数,可以为负数,也可以不是。
GCC 抱怨是因为你的定义y
显然是一个格式错误的constexpr
宣言。初始值违反了[表达式.const]/2 https://timsong-cpp.github.io/cppwp/n4659/expr.const#2,其中指定:
表达式 e 是 a核心常量表达式 unless这
遵循抽象机的规则,对 e 的求值将
评估以下表达式之一:
- 具有本国际标准的条款 [intro] 至 [cpp] 中指定的未定义行为的操作 [ 注:
例如,包括有符号整数溢出(子句 [expr]),
某些指针算术([expr.add]),除以零,或者
某些轮班操作——《尾注》];
所以你不能使用1<<x
初始化y
。分支永远不会被执行并可以被消除,这并不重要。 GCC 仍然有义务验证它在语义上的正确性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)