Если вы разрабатываете приложение , вам не следует корректировать код в соответствии с доступной версией компилятора, вместо этого вы должны указать, для какого стандарта компилятора ваш код требует :
set (CMAKE_CXX_STANDARD 11)
Если вы создаете библиотеку кода , предназначенную для использования в различных контекстах, используйте компилятор обнаружение функции и условную компиляцию.Например:
write_compiler_detection_header(
FILE "${CMAKE_CURRENT_BINARY_DIR}/compiler_features.h"
PREFIX Foo
COMPILERS GNU
FEATURES
cxx_variadic_templates
)
А затем:
#include "compiler_features.h"
#if Foo_COMPILER_CXX_VARIADIC_TEMPLATES
# include "with_variadics/interface.h"
#else
# include "no_variadics/interface.h"
#endif
Это особенно полезно для компиляторов, таких как MSVC, которые имеют много функций из C ++ 17, но при этом не имеют некоторых основных функций из C ++11 (например, выражение SFINAE).
CMake имеет встроенные детекторы для многих популярных функций C ++.
PS.Если вам действительно интересно, G ++ до 5.0 использует по умолчанию gnu++98
стандарт и 6.0 gnu++14
(GNU-диалект -std = c ++ 14).