Почему деление нуля с плавающей запятой запрещено в constexpr?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему деление нуля с плавающей запятой запрещено в constexpr?

Сообщение Anonymous »

При использовании компилятора g++ оба они компилируются нормально:

Код: Выделить всё

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
Обратите внимание, что cppreference приводит именно этот пример, подтверждающий, что это запрещено.
Я не понимаю, почему это запрещено. Учитывая, что std::numeric_limits::is_iec559 — это constexpr, компилятор четко знает во время компиляции, внутри constexpr, разрешено ли деление на ноль. Итак, в случае, если это разрешено... почему это не разрешено в constexpr?
EDIT: было предложено, что этот вопрос аналогичен поведению деления с плавающей запятой на ноль. Мой вопрос здесь более целенаправленный (почему первые два выражения кажутся разрешенными, а третье — запрещенным)? Ответы на другой вопрос, похоже, не проливают на это света: некоторые ответы подразумевают, что все три выражения являются UB (и, следовательно, запрещены? Не думаю, что я в это верю; но в любом случае есть что-то особенное в constexpr, что, кажется, имеет значение, поэтому этот вопрос сосредоточен на constexpr).
Этот вопрос также похож на деление чисел с плавающей запятой во время компиляции на ноль в C++, принятый ответ которого (по сути, «это UB, так что все пойдет») вообще не помогает.

Подробнее здесь: https://stackoverflow.com/questions/786 ... -constexpr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»