Re[2]: enum class value initialization
От: B0FEE664  
Дата: 26.02.22 20:01
Оценка:
Здравствуйте, Igore, Вы писали:

BFE>>Решил я сегодня первый раз воспользоваться функцией std::from_chars и не понял как правильно проверять результат вызова.

BFE>>Если я правильно понимаю, "ec is value-initialized" означает инициализацию вида errc{}.
BFE>>Внимание вопрос: какое значение будет у ec в случае успешного выполнения?
I>Чем первая строка из примера документации не нравится?
I>
I>        if (ec == std::errc())
I>        {
I>            std::cout << "Result: " << result << ", ptr -> " << std::quoted(ptr) << '\n';
I>        }
I>

Ничем не нравится:
Откуда следует, то это не undefined behavior?
Какое значение у std::errc()?
Откуда следует, что оно не совпадает ни с каким значение ошибки?

Относительно undefined behavior:
Если посмотреть в дебагере, то у std::errc() значение 0, но этого значения нет в перечислении. При этом:

If the enumeration type does not have a fixed underlyingtype, the value is unchanged if the original value is within the range of the enumeration values (9.7.1), and otherwise, the behavior is undefined.

это из 7.6.1.8/10 С++17

Мне не понятно, что такое the range of the enumeration values. У него крайне смутное описание:
9.7.1/8

For an enumeration whose underlying type is fixed, the values of the enumeration are the values of the underlying type. Otherwise, the values of the enumeration are the values representable by a hypothetical integer type with minimal width M such that all enumerators can be represented. The width of the smallest bit-field large enough to hold all the values of the enumeration type is M. It is possible to define an enumeration that has values not defined by any of its enumerators. If the enumerator-list is empty, the values of the enumeration are as if the enumeration had a single enumerator with value 0.


Мне совсем не сложно представить гипотетический целый тип состоящий из двух бит и принимающий значения (3,4,5,6) для перечисления enum class X{ a=3, b=4, c=5, d=6 }; Нуля среди них нет, значит 0 — вне диапазона. Или же где-то сказано, про какие-то ограничения на гипотетические целые типы?
Ладно, предположим, что 0 всегда допустимое значение для перечисления (хотя я пока не вижу откуда это следует), тогда откуда можно узнать, errc{} не совпадает ни с каким значением этого перечисления?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.