[Development] API style guide: scoped enum or not?

Marc Mutz marc.mutz at qt.io
Wed Jun 14 14:59:40 CEST 2023


On 02.05.23 10:58, Volker Hilsheimer via Development wrote:
> During the header review, but also in API discussions leading up to it, we had a few cases where it would have helped if we had clearer guidelines about when to use scoped enums, and when not.

Was there some consensus here? We're discussing this _again_ in the 6.6 
review...

Let me propose the following, separate issues, so we have something 
concrete to +1 or -1:

[All capitalized words have the meaning of IETF RFCs]

A) new enums MUST have an explicit underlying type¹²

For unscoped enums, the compiler otherwise picks one, possibly resulting 
in BiC when new addtions change the underlying type or otherwise just 
warnings because one compiler uses a signed and the other an unsigned 
type (most recent exmaple: QTBUG-113792). For scoped enums, the type is 
int, but probably not always, and why require the reader of the code to 
know the C++ rules when we can make it explicit?

B) new enums MUST be scoped, also when nested in classes¹²

Type safety > verbosity. Qt has never preferred brevity over verbosity 
when it comes to readability, and while the use of short identifiers 
makes code often more readable than using long ones, C++20's `using 
enum` feature empowers users to choose between brevity and verbosity on 
a per-use basis. Since we should be designing for the future and not the 
past, this removes the major objection for scoped enums. C++17 doesn't 
matter. If we really want leaking, we can use constexpr variables of 
scoped enum type in lieu of enumerators.

C) scoped enums SHOULD NOT repeat (part of) an enum's type name in the 
enumerators²

This was a work-around from the times of C/C++98 when you could neither 
scope the value of an enumeration nor prevent the leakage of enumerator 
names into the enclosing scope. We have both now in C++11: any 
enumerator can be scoped and scoped enums don't leak the name into the 
enclosing scope anymore.

I cannot rule out that sometimes some part of the enum's type may make 
sense in an enumerator's name, but not consistently in all of them just 
because one of them needs it etc, so this is a SHOULD, not a MUST.

I have been told today that QML allows scoped C++ enums to be used 
without the scope. If this is true, it should be fixed to always require 
the scope, because otherwise the argument goes "but in QML, the scope 
isn't visible, so a part of the enum type name must be included in the 
enumerators".

¹ except when C compatibility is required
² applies to all enums come Qt 7

It would be good if we could have clarity on A-C before we finish up the 
6.6 API review.

Thanks,
Marc

-- 
Marc Mutz <marc.mutz at qt.io>
Principal Software Engineer

The Qt Company
Erich-Thilo-Str. 10 12489
Berlin, Germany
www.qt.io

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen
Sitz der Gesellschaft: Berlin,
Registergericht: Amtsgericht Charlottenburg,
HRB 144331 B



More information about the Development mailing list