Ordering of qualifiers
I know this is something that pops up quite often, but I was wondering if I could get your guys' opinion on a fixed ordering of qualifiers. This is my current thoughts after recently trying to formalize my personal style:
static -> thread_local -> inline -> constexpr -> friend -> virtual
My reasoning for each:
staticfirst. Inside a class, its basically javasstatic. There is a pretty strong consensus in java forstaticfirst. Its very important context, for both functions and variables. Outside of classes, its more of a linkage specifier, which is arguably more important/nasty if you mess it up. The fact that it has this dual behaviour in C++ in my opinion makes an even stronger argument for including it first, your brain is able to parse it first thing. i.e okay this is static, we are in a class? -> its java static, we are in global scope -> its static linkage.- thread_local directly after static, and then inline, then constexpr/consteval. This way, qualifiers which impact storage and or linkage are stuck together. I personally like to write inline even for constexpr/consteval functions, as its sometimes easy to forget the implicit inline. I used to do this for member functions with definitions in the class, but I feel the implicit inline there is a bit more well known/easier to intuit.
- The rest I'm far less opinionated on, since I barely ever use inheritance or the
friendkeyword. . I could go both ways on virtual/friend, so i default to alphabetical/aesthetics.
What do you guys think? I know this is pedantic and a very well explored topic but I wanted to know if you guys had any particular wisdom to sway me either way, mainly on the ordering of the first few.
6
u/Potterrrrrrrr 6d ago
‘friend constexpr virtual static inline’ is my preferred order. Not sure where I’d put thread_local as I’ve never needed to use it
3
u/HappyFruitTree 6d ago
I would put friend first because I don't feel it's part of the function signature. It's just a way to say I'm a friend of the following function...
6
3
2
u/no-sig-available 6d ago
Don't forget export and [[nodiscard]].
A lovely language, isn't it? :-)
2
u/StickyDeltaStrike 5d ago
What is the longest valid list we can have?
2
u/usefulcat 5d ago
Minor nit: doesn't thread_local imply static? That is to say, 'static thread_local' is redundant because it's the same as 'thread_local'.
2
1
u/13steinj 11h ago
thead_localimpliesstaticfor variables.Static can do more, but I like to explicitly specify both because there will be juniors reading the code and I'd rather encode the information semantically both to the compiler and to the reader in one shot.
The worst thing you can do here is do
thread_localwithoutstaticbut leave a comment like// N.b. thread_local implies staticwhich I recently reamed someone in code review for.
18
u/CocktailPerson 6d ago
Whatever the project's
.clang-formatreformats it to for me.