Sorry for the double post; I blame Outlook's UI, and so should you ;)

On 16.01.25 11:58, Marc Mutz via Development wrote:
> Hi,
> 
> Groundhog Day...
> 
> Like every API review, so also in 6.9, we have the discussions between
> proponents of scoped vs. unscoped enums in class scope.
> 
> Can we, please, settle this by strengthening the wording of
> https://wiki.qt.io/API_Design_Principles#Enums_in_classes to something
> that requires scoped enums?
> 
> I believe everyone agrees that there are _technical_ reasons to prefer
> scoped enums: no implicit conversion to underlying_type, defined
> underlying type even if not explicitly given, etc.
> 
> Which leaves the stylistic issue. But I believe the argument
> 
>   > Using scoped enums in this case would add redundant line noise:
> 
> is a very _un_-Qt-ish one. In Qt, we believe that brevity does not
> automatically equal readability¹, and the more explicit
> 
>   > if (point.state() == TouchPoint::State::Pressed)
> 
> is more (but certainly not less) readable than
> 
>   > if (state() == TouchPoint::Pressed)
> 
> Even as the author if the code, the IDE will throw all enumerators of
> unscoped enums into the autocompletion set, and while it may be said to
> be a tooling problem, the fact that for scoped enums I'm first presented
> with the enum, and only then with the enum's enumerators is a powerful
> help. In fact, I find myself using the optional scoped mode for unscoped
> enums more and more, for this very reason.
> 
> So, I think we should ban the use of unscoped (new) enums, with only one
> exception: if C compat is required.
> 
> If the enum is a complete representation of the class (e.g.
> QJsonParseError::ParseError), I concur that it makes little sense to
> require QJsonParse::ParseError::FooBar.²
> 
> But the implicit conversions of unscoped enums are still unwanted!
> 
> Even there, we therefore might want to require scoped enums, but then,
> in the class, say `using enum E;` to import the names into class scope,
> gaining the shortcut notation while keeping the disabled implicit
> conversion to underlying type. Alas, that's a C++20 feature, so while I
> think that's the way forward, for the time being, I'm hesitant to
> require writing manual forwarders as static constexpr class variables
> (though, for small enums of a handful of entries, I'd say "do it").
> 
> In Qt 7, though, we should definitely make all old enums scoped, too
> (with (hopefully deprecate-able) using enum E for SC). We might actually
> be able to do this in Qt 6 if we can figure out reliably what the
> unscoped enum's underlying type was (which, unfortunately, can, and
> does, differ from platform to platform).
> 
> ¹ to wit, Q3Slider s(0, 100, 10, 20, 50, true, false, "slider") vs.
> Q4Slider s(Qt::Horizontal); set.setRange(0, 100); ...
> 
> ² Note, though, how QGrpcStatus
> (https://doc.qt.io/qt-6/qgrpcstatus.html) elegantly evades the issue by
> putting the enum at namespace scope.
> 
> Thanks,
> Marc
> 
-- 
Marc Mutz <marc.m...@qt.io> (he/his)
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

-- 
Development mailing list
Development@qt-project.org
https://lists.qt-project.org/listinfo/development

Reply via email to