Конструктор weekday(unsigned wd)
обещает хранить любое значение в диапазоне [0, 255]. Обоснование этого:
- Это очень быстро.
- Позволяет клиенту присвоить «неиспользуемое» значение чему-то полезному в логике клиента.
Для примера (2):
constexpr weekday not_a_weekday{255};
...
weekday wd = not_a_weekday;
in >> wd;
if (wd == not_a_weekday)
throw "oops";
weekday
арифметика возвращает диапазон обратно в [0, 6], потому что если вы напишите алгоритм для выполнения арифметики по модулю 7, без проверки диапазона вообще, это то, что естественно происходит. То есть это самая быстрая вещь.
Итак, подведем итог: производительность - это обоснование для текущей спецификации weekday
в сочетании с sizeof
, который настолько мал, насколько это возможно (что также может способствовать повышению производительности).
Тем не менее, учитывая максимально возможную производительность, любое поведение, оставшееся (происходящее естественным образом), может быть полезным для стандартизации и позволяет клиентам использовать преимущества этого поведения, а не говорить, что они являются неопределенным поведением TM .
Действительно, спецификация максимально избегает UB, вместо этого выбрав Unspecified Behavior. Например, weekday{300}
может не хранить желаемое значение, но не может переформатировать ваш диск, и оптимизатору не разрешается делать вид, что код не существует.