Nice to see some activity happening here! Also I agree with most of the points here and I'm particularly glad that we won't overuse modern constructs like trailed return types or noexcept.
Occurrences of unscoped enumerations (enum) should generally be replaced with scoped enumerations. We would use the enum struct variant, not enum class, as enums come much closer to a "bundle of data" than "object-oriented entity with methods".
Can't agree with that one. I think "enum struct" is very obscure and more people use "enum class". For example, if you pick almost any modern C++ book - "Effective Modern C++", "C++17 The Complete Guide", "The C++ Programming Language", etc - all of them use "enum class" for their examples and don't even mention "enum struct" at all.
More examples:
Google C++ standardsC++ Core Guidelinescppreference - "enum struct"s are mentioned, but "enum class" are used in examples.
override and final
final is mostly pointless in my opinion.
override is very good - it should be added everywhere, because it's a clear indication where something is overriding base-class virtual function + it adds additional compile-time checks that function signatures match.
using everywhere, or just for templates
I think
using should be used everywhere instead of
typedef as
using is much clearer in every possible way, but especially for function pointers and multi-word types. Some examples:
typedef unsigned char Uint8;
// can become
using Uint8 = unsigned char;
typedef void(*ContextDestroyCallback)(void*);
// can become
using ContextDestroyCallback = void(*)(void*);
Also it would be nice to have something about attributes like
[[nodiscard]],
[[maybe_unused]] and
[[deprecated]]. They can be helpful for improving API's clarity (and when we'll need to deprecate something in the future).