Код: Выделить всё
constexpr double d1 = 2.0 / 1.0;
const double d2 = 2.0 / 0.0;
Код: Выделить всё
constexpr double d2 = 2.0 / 0.0;
Код: Выделить всё
error: ‘(2.0e+0 / 0.0)’ is not a constant expression
Я не понимаю, почему это запрещено. Учитывая, что std::numeric_limits::is_iec559 — это constexpr, компилятор четко знает во время компиляции, внутри constexpr, разрешено ли деление на ноль. Итак, в случае, если это разрешено... почему это не разрешено в constexpr?
EDIT: было предложено, что этот вопрос аналогичен поведению деления с плавающей запятой на ноль. Мой вопрос здесь более целенаправленный (почему первые два выражения кажутся разрешенными, а третье — запрещенным)? Ответы на другой вопрос, похоже, не проливают на это света: некоторые ответы подразумевают, что все три выражения являются UB (и, следовательно, запрещены? Не думаю, что я в это верю; но в любом случае есть что-то особенное в constexpr, что, кажется, имеет значение, поэтому этот вопрос сосредоточен на constexpr).
Этот вопрос также похож на деление чисел с плавающей запятой во время компиляции на ноль в C++, принятый ответ которого (по сути, «это UB, так что все пойдет») вообще не помогает.
Подробнее здесь: https://stackoverflow.com/questions/786 ... -constexpr
Мобильная версия