site - ¿Cómo compruebo la compatibilidad con C++ 20? ¿Cuál es el valor de__cplusplus para C++ 20?
current c++ (3)
Relacionado con las preguntas ¿Cómo compruebo la compatibilidad con C ++ 11? y ¿Cuál es el valor de __cplusplus para C ++ 17?
¿Cómo puedo preguntar si el compilador puede manejar / está configurado para usar C ++ 20? Sé que, en principio, es posible consultar la versión de C ++ de la siguiente manera:
#if __cplusplus > ???
// C++20 code here
#endif
¿Qué debería ???
¿Ser para C ++ 20?
El nuevo valor estará disponible en algún momento en [cpp.predefined] p1.1 :
__cplusplus
El literal entero
201703L
. [Nota: se pretende que las versiones futuras de esta Norma Internacional reemplacen el valor de esta macro con un valor mayor. - nota final]
Los valores actuales utilizados en los compiladores principales son, a partir de 2018-11-30:
- gcc :
201709L
godbolt - clang :
201707L
godbolt - msvc :
201704L
godbolt (requiere/Zc:__cplusplus
) - icc : godbolt sin godbolt (por el momento)
Ya que todos ellos ya son más altos que los 201703L
de C ++ 17, ya puedes usar:
#if __cplusplus > 201703L
// C++20 code
#endif
Es muy temprano para eso.
Hasta que el estándar lo reemplace, use:
#if __cplusplus > 201703L
// C++20 code
#endif
ya que la macro predefinida de C ++ 20 va a ser más grande que la de C ++ 17.
Como menciona la respuesta de @ SombreroChicken, [cpp.predefined] (1.1) especifica (el énfasis es mío):
__cplusplus
El literal entero
201703L
. [Nota: se pretende que las versiones futuras de esta Norma Internacional reemplacen el valor de esta macro con un valor mayor .]
Las macros utilizadas, a partir de noviembre de 2018, son:
- GCC 9.0.0:
201709L
para C ++ 2a. Demo en vivo - Clang 8.0.0:
201707L
. Demo en vivo - VC ++ 15.9.3:
201704L
(como menciona la respuesta de @ Acorn).
PD: Si está interesado en características específicas, entonces [cpp.predefined] (1.8) define las macros correspondientes, que podría usar. Tenga en cuenta, sin embargo, que podrían cambiar en el futuro.
__cplusplus
no se conoce la versión __cplusplus
porque C ++ 20 aún está en desarrollo. Solo hay borradores para C ++ 20.
El último borrador del N4788 todavía contiene:
__cplusplus
El literal entero
201703L
. [Nota: se pretende que las versiones futuras de esta Norma Internacional reemplacen el valor de esta macro con un valor mayor. "Nota final"
En cuanto a comprobarlo, usaría la respuesta de @gsamaras.