gpt4 book ai didi

c++ - constexpr-evaluating negative bitshift 时的未定义行为?

转载 作者:太空狗 更新时间:2023-10-29 20:02:08 27 4
gpt4 key购买 nike

考虑以下代码片段:

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]

我可以猜到这可能是从哪里来的:y 上的 constexpr 声明使 GCC 在编译时评估 y,它可能在哪里是消极的。删除 constexpr 可修复错误。

但是,这是标准未定义的行为吗?条件始终为假,因此永远不会使用 y 的值。

在我的实际代码中,x 是一个模板参数,它可能是负数,也可能不是负数。

最佳答案

GCC 提示是因为你对 y 的定义显然是一个错误的 constexpr声明。 initialzier 违反了 [expr.const]/2 ,它指定:

An expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine, would evaluate one of the following expressions:

  • an operation that would have undefined behavior as specified in Clauses [intro] through [cpp] of this International Standard [ Note: including, for example, signed integer overflow (Clause [expr]), certain pointer arithmetic ([expr.add]), division by zero, or certain shift operations  — end note ] ;

所以你不能使用1<<x初始化 y .分支永远不会被执行并且可以被消除并不重要。 GCC 仍然有义务验证它在语义上的正确性。

关于c++ - constexpr-evaluating negative bitshift 时的未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510531/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com