Расширение языка c++17 и флаг std:c++17

Меня смущают разные ошибки в Visual Studio 2017 (версия 15.9.11):

'if constexpr' is a C++17 language extension

а также

language feature 'structured bindings' requires compiler flag '/std:c++17'

Я знаю, что добавление флага /std:c++17 решит эти проблемы, но почему два разных сообщения? В чем разница между расширением языка и требованием флага компилятора?

Меня больше интересует эта вещь, потому что я пишу игру на Unreal Engine 4.24. Я могу использовать if constexpr, но не могу использовать структурированные привязки, хотя использую тот же компилятор.

Почему?


person zompi    schedule 05.06.2020    source источник


Ответы (1)


if constexpr — чрезвычайно полезная языковая конструкция из C++17. Это очень удобно для реализации, например, многих оптимизаций в стандартной библиотеке.

Таким образом, когда Visual Studio 15.3 изначально реализовывал if constexpr, он широко использовался в реализации стандартной библиотеки даже при компиляции в режиме C++14. Но поскольку большая часть этого кода находится в заголовках, которые, с точки зрения компилятора, являются частью вашего исходного кода, это означает, что вы тоже можете его использовать. Для этого они сделали используя if constexpr из C++14 предупреждение, а не ошибку, предупреждение, которое они отключили в своих заголовках с помощью #pragmas.

Однако, несмотря на то, что в документации MSVC это называется предупреждением, оно выдается компилятором как ошибка, которую можно подавить.

Таким образом, разница в формулировках между этими двумя условиями, вероятно, связана с тем фактом, что if constexpr «ошибка» считается «предупреждением», несмотря на то, что по умолчанию она представляется как «ошибка».

person Nicol Bolas    schedule 05.06.2020
comment
Однако OP прямо говорит, что они получают ошибки, а не предупреждения, так что это не отвечает на вопрос. - person Jörg W Mittag; 05.06.2020
comment
@JörgWMittag: я просто повторяю собственную ссылку MSVC в примечаниях к выпуску говорится: «if constexpr» поддерживается в /std:c++14 с предупреждением, которое можно подавить, что радует авторов библиотек метапрограммирования шаблонов во всем мире. - person Nicol Bolas; 05.06.2020
comment
@JörgWMittag И в любом случае, со стандартной точки зрения, все они просто диагностика, без дифференциации их серьезности. - person Deduplicator; 05.06.2020
comment
@JörgWMittag: я нашел дополнительную информацию; они явно называют это предупреждением в своей документации, но по умолчанию оно отображается как ошибка. Я предполагаю, что тот факт, что его можно подавить, заключается в том, что Microsoft считает их разными. - person Nicol Bolas; 05.06.2020
comment
О, дорогой MSVC и их собственные стандарты, поэтому они поместили if constexpr в С++ 14! Это многое объясняет. Спасибо! - person zompi; 06.06.2020