diff --git a/include/span.h b/include/span.h index 8151737..7bb9c18 100644 --- a/include/span.h +++ b/include/span.h @@ -45,6 +45,12 @@ #pragma push_macro("constexpr") #define constexpr +// On Windows, if NOMINMAX is not defined, then windows.h defines the macro max +#ifdef _WIN32 +#pragma push_macro("max") +#define max max +#endif + // VS 2013 workarounds #if _MSC_VER <= 1800 @@ -2196,6 +2202,11 @@ general_span_iterator operator+(typename general_span_iterator::diff #undef constexpr #pragma pop_macro("constexpr") +#ifdef _WIN32 +#undef max +#pragma pop_macro("max") +#endif + #if _MSC_VER <= 1800 #pragma warning(pop) diff --git a/include/string_span.h b/include/string_span.h index cc87068..6a71ce9 100644 --- a/include/string_span.h +++ b/include/string_span.h @@ -235,13 +235,28 @@ public: constexpr basic_string_span(const basic_string_span& other) = default; // move +#ifdef GSL_MSVC_NO_SUPPORT_FOR_MOVE_CTOR_DEFAULT + constexpr basic_string_span(basic_string_span&& other) + : span_(std::move(other.span_)) + { + } +#else constexpr basic_string_span(basic_string_span&& other) = default; +#endif // assign constexpr basic_string_span& operator=(const basic_string_span& other) = default; // move assign +#ifdef GSL_MSVC_NO_SUPPORT_FOR_MOVE_CTOR_DEFAULT + constexpr basic_string_span& operator=(basic_string_span&& other) + { + span_ = std::move(other.span_); + return *this; + } +#else constexpr basic_string_span& operator=(basic_string_span&& other) = default; +#endif // from nullptr and length constexpr basic_string_span(std::nullptr_t ptr, size_type length) noexcept @@ -561,8 +576,6 @@ bool operator>=(const gsl::basic_string_span& one, const gsl::bas #if _MSC_VER <= 1800 -#pragma warning(pop) - #ifndef GSL_THROW_ON_CONTRACT_VIOLATION #undef noexcept #pragma pop_macro("noexcept")