浮点除以零而不是constexpr

Wie*_*ebe 4 undefined-behavior constexpr c++11 c++14

编译时:

constexpr double x {123.0};
constexpr double y = x / 0.0;
std::cout << x << " / 0 = " << y << "\n";
Run Code Online (Sandbox Code Playgroud)

编译器(gcc 4.9.2,-std = c ++ 11或c ++ 14)失败,给出错误:

(1.23e+2 / 0.0)' is not a constant expression
  constexpr double y = x / 0.0;
Run Code Online (Sandbox Code Playgroud)

在决定是否y可以成为constexpr时,结果(Inf)如何相关?

作为参考,这似乎是这样做的方式:

static constexpr double z = std::numeric_limits<double>::quiet_NaN();
static constexpr double w = std::numeric_limits<double>::infinity();
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 5

Infinity是一个实现定义的结果,该标准不需要IEEE浮点数并且除以零是正式未定义的行为,并且常量表达式排除了未定义的行为.

从草案C++标准部分5.6 [expr.mul]:

二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义.