On Fri, Jul 23, 2021 at 7:40 AM Petr Viktorin <encu...@gmail.com> wrote:
[snip]
>     On 21. 07. 21 14:18, Nick Coghlan wrote:

> [snip]
> >     Please don't put the enum in the stable ABI. If we would add another
> >     value and then an older extension would receive it, we'd get
> undefined
> >     behavior.
> >
> >
>
> After researching a bit more, I see that casting unknown values to enum
> is only undefined/unspecified behavior in C++. But we do support C++
> extensions, and so I'll try to get enums out of the stable ABI.
>
> (In both C & C++, the size of an `enum` is implementation-defined.
> That's unlikely to be a problem in practice, but one more point against
> enum.)
>

I can't speak much for C, but for C++ this is fine I think? enums have the
same range of values as their "underlying type" (see e.g.
[basic.fundamental] <https://eel.is/c++draft/basic.fundamental> and
[dcl.enum] <https://eel.is/c++draft/dcl.enum>). Aside from representation,
[expr.static.cast] <https://eel.is/c++draft/expr.static.cast> explicitly
allows conversion when in-range: "the value is unchanged if the original
value is within the range of the enumeration values". (Note if you click
the link -- "fixed underlying type" refers to a form of enum which doesn't
exist in C; the C-like enums are the ones without a fixed underlying type.)

And as Larry points out, you can force the range of values to be as large
as you want by specifying a large enumerator.

However, the standard is not meant for reading by us mere mortals, so I
usually use cppreference, which has this to say at
https://en.cppreference.com/w/cpp/language/enum :

Values of integer, floating-point, and enumeration types can be converted
> by static_cast <https://en.cppreference.com/w/cpp/language/static_cast>
> or explicit cast
> <https://en.cppreference.com/w/cpp/language/explicit_cast>, to any
> enumeration type. If the underlying type is not fixed and the source value
> is out of range, [the result is unspecified (until C++17) | the behavior
> is undefined (since C++17)]. [...] Note that the value after such
> conversion may not necessarily equal any of the named enumerators defined
> for the enumeration.


-- Devin
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/IRRUAJWZVPH6XXOP2NJKOH2UHEGM2JDH/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to