¿Cómo puedo usar las características de C ++ 14 al construir proyectos qmake?

Actualmente estoy usando las características C ++ 11 en mis aplicaciones Qt. Sin embargo, me gustaría usar algunas de las nuevas características de C ++ 14 en mis aplicaciones.

Para habilitar C ++ 11 en una aplicación Qt, solo se necesita agregar una línea en el archivo del proyecto qmake , a saber:

CONFIG += c++11 

o esto para versiones anteriores:

 QMAKE_CXXFLAGS += -std=c++1y 

Ya traté de hacer lo mismo con C ++ 14, pero no funcionó. Cambié la línea mencionada del proyecto qmake de esta manera:

 CONFIG += c++14 

o esto para versiones anteriores:

 QMAKE_CXXFLAGS += -std=c++1y 

Después de eso, muchos errores de comstackción, que no existían antes, aparecen cuando se intenta construir el proyecto. El proyecto comstack bien, sin embargo, si trato de usar cualquier característica de C ++ 14, obtengo un error de comstackción. Esto es un ejemplo:

 template constexpr T pi = T(3.1415926535897932385); 

Este es el error correspondiente:

 main.cpp:7: error: template declaration of 'constexpr const T pi' constexpr T pi = T(3.1415926535897932385); ^ 

¿Cómo habilitar las características de C ++ 14 cuando se utiliza un proyecto qmake en QtCreator?

Estoy usando Qt 5.3.2, Qt Creator 3.2.1 y MinGW 4.8.2 de 32 bits.

Qt Creator es solo un IDE .

Puede pensar en los IDE como “editores de texto más inteligentes ” que ayudan al desarrollador a depurar, crear, completar códigos, administrar archivos, etc.

IDEs son irrelevantes durante la comstackción.

Lo que importa es tu comstackdor. Y es independiente de tu IDE.

g ++ 4.8.x no admite muchas características de C ++ 14: echa un vistazo a esta página para saber qué características de C ++ 14 son compatibles .

Esto ahora se admite correctamente desde Qt 5.4 . Simplemente escribe esto en tu archivo de proyecto qmake:

 CONFIG += c++14 

El cambio de código necesario fue a mediados de 2014 por Thiago:

Agregar soporte para CONFIG + = c ++ 14

Acabo de crear el cambio de documentación necesario:

Mencione la opción CONFIG de c ++ 14 en la referencia de la variable qmake

Tenga en cuenta que las plantillas variables solo son compatibles con gcc 5.0, pero luego su código funciona bien. Esto se puede usar para probar C ++ 14 con gcc más antiguo:

main.cpp

 #include  int main() { // Binary literals: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3472.pdf // Single-quotation-mark as a digit separator: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3781.pdf std::cout << 0b0001'0000'0001; return 0; } 

main.pro

 TEMPLATE = app TARGET = main CONFIG -= qt CONFIG += c++14 SOURCES += main.cpp 

Construir y ejecutar

 qmake && make && ./main 

Salida

 257 

Para usar C ++ 14 con qmake con versiones anteriores a Qt 5.4 (no hace ninguna diferencia si lo usas con Qt Creator o con algún otro IDE o desde la línea de comandos) y gcc , agrégalo a tu archivo .pro :

 QMAKE_CXXFLAGS += -std=c++1y 

qmake recibió soporte para CONFIG += c++14 con Qt 5.4, por lo que puede usarlo para proyectos en los que se sienta cómodo requiriendo al menos esa versión de Qt. Asegúrese de usar los indicadores del comstackdor explícitos, o use la opción CONFIG , pero no ambos al mismo tiempo, para evitar el conflicto de interruptores.


Lamentablemente, gcc 4.8.2 es compatible con muy pocas características de C ++ 14 (ver aquí ), pero puedes probarlo con este fragmento de código:

 #include  auto f() { return 42; } int main() { std::cout << f() << std::endl; } 

Eso comstackrá bien con QMAKE_CXXFLAGS += -std=c++1y , pero dará la advertencia con CONFIG += c++11 o QMAKE_CXXFLAGS += -std=c++1x .

Por algún extraño motivo, esto es lo que hace Qt: si el comstackdor es gcc o mingw, CONFIG+=C++14 se transforma en un indicador del comstackdor -std=c++14 (eso es lo que esperas)

Si se trata de otro comstackdor (como clang), CONFIG=C++14 se transforma estúpidamente en -std=c++11 (sic!), Por lo que obtendrá errores sobre las características no admitidas, incluso si su versión clang admite C ++ correctamente 14.

Para solucionarlo, especifique el indicador explícitamente:

 QMAKE_CXXFLAGS += -std=c++14 

De esta forma, está seguro de que su comstackdor (g ++, mingw o clang) recibirá las banderas correctas.