[Development] RFC: handling of C++ feature test macros

Mutz, Marc marc at kdab.com
Mon Sep 9 14:44:15 CEST 2019


Hi,

Qt uses C++ feature test macros (__cpp_...) to detect post-C++11 
features, and the status quo is that we only support compilers that 
provide them.

This proposal does not intend to change this.

This proposal intends to change the de-facto status quo in how we check 
these feature macros.

Currently, we check them for presence and their value:

   #if defined(__cpp_foo) && __cpp_foo >= 201911L
     // use foo feature
   #endif

I have started to add these guard in tests without guards, so as to be 
informed by CI when we encounter pre-standard values, which is one of 
the reasons proponents of this style favour it in the first place.

While the version-less checks in tests are a very recent addition, I'd 
recommend to deal with such special cases if and when they hit us, and 
not earlier.


       I therefore propose to allow the version check only when the code
       thus protected actually depends on a non-initial version of the 
feature.
       Otherwise, a plain #ifdef __cpp_foo has to be used.

Rationale:

1. For the writer of the code, having to add the version check means 
researching the history of a feature to unearth the value with which the 
feature was originally added. cppreference.com is not very helpful in 
that regard, as APIs are tagged with (since C++17), but not with (if 
__cpp_foo >= 201911). There's a page listing all the values, incl., one 
might hope, all the historical ones, but it's still extra work.

2. For the reader of the code, at least those poor souls who cannot 
memorize all the feature macros' initial values, the version check 
actively hides information: the structure of the code indicates that the 
code depends on a certain version of the feature when in fact it 
doesn't.

3. The wider C++ community seems to settle for non-versioned checks if 
the initial version is sufficient, which may mean that Qt introduces an 
impedance mismatch for pre-standard values where Qt checks the version 
and users and other libraries do not. If there actually are non-standard 
implementation who nonetheless defined the standard feature-test macro, 
but with a lower value, Qt and the user will not agree on the presence 
of a feature.


Flame away...

Thanks,
Marc



More information about the Development mailing list