Краткий ответ: Нет Ненадежно полагаться на внутренние определения препроцессора в реализации среды выполнения Visual C ++, и технически все символы компилятора, начинающиеся с одного _
, зарезервированы для использования.реализацией.
Например, _NOEXCEPT
использовался для внутреннего использования в Visual Studio 2015 и 2017, но с VS 2017 (обновление 15.8) этот макрос больше не существует;заголовки просто используют noexcept
напрямую.
Рекомендация использовать __has_include
хороша, но не поддерживается до VS 2017 (обновление 15.3).
Другая проблема заключается в том, что__cplusplus
не означает, что вы используете /std:c++17
, если вы не используете VS 2017 (обновление 15.7) с новым переключателем /Zc:__cplusplus
, который по умолчанию выключен.
Вероятно, самый безопасный способ сделать этодиапазон версий VS будет:
#if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L) && (_MSC_VER >= 1913))
#if __has_include(<optional>)
#include <optional>
template <typename T> using Optional = std::optional<T>;
#else
#include "boost/optional/optional.hpp"
template <typename T> using Optional = boost::optional<T>;
#endif
#else
#include "boost/optional/optional.hpp"
template <typename T> using Optional = boost::optional<T>;
#endif
См. Соответствие языку Visual C ++