Некоторые языковые функции в более поздних языковых стандартах невероятно полезны, и производители компиляторов решили перенести их в более ранние версии. Наиболее существенным примером этого является if constexpr
.
Эта простая программа:
template <typename T>
constexpr int get() {
if constexpr (sizeof(T) > 10) {
return 1;
} else {
return 0;
}
}
static_assert(get<int>() == 0, "!");
static_assert(get<char[100]>() == 1, "!");
технически требует C ++ 17 в соответствии с правилами языка и технически плохо сформирован в C ++ 11 ... но и gcc, и clang компилируют его просто отлично на -std=c++11
в любом случае. Каждый из них выдает предупреждение.
Clang сообщает вам, что это за предупреждение, чтобы вы могли его отключить:
foo.cxx:3:8: warning: constexpr if is a C++17 extension [-Wc++17-extensions]
if constexpr (sizeof(T) > 10) {
^
1 warning generated.
Компиляция clang с -Wno-C++17-extensions
не выдает предупреждений.
Но gcc на самом деле не говорит, откуда исходит предупреждение:
foo.cxx: In function ‘constexpr int get()’:
foo.cxx:3:8: warning: ‘if constexpr’ only available with -std=c++17 or -std=gnu++17
if constexpr (sizeof(T) > 10) {
^~~~~~~~~
Есть ли способ отключить это предупреждение? Я знаю, что это «доступно только» в C ++ 17, но есть причины , чтобы еще не перейти на полный C ++ 17.