Fix `pair::swap(const pair&)` and `tuple::swap(const tuple&)` errors with `__declspec(dllexport)` (#3045)

This commit is contained in:
Stephan T. Lavavej 2022-08-22 14:29:25 -07:00 коммит произвёл GitHub
Родитель 2a1b881e2f
Коммит febb6430ac
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 8 добавлений и 0 удалений

Просмотреть файл

@ -582,6 +582,7 @@ public:
}
#if _HAS_CXX23
template <int = 0> // see GH-3013
constexpr void swap(const tuple& _Right) const
noexcept(conjunction_v<is_nothrow_swappable<const _This>, is_nothrow_swappable<const _Rest>...>) {
_Swap_adl(_Myfirst._Val, _Right._Myfirst._Val);

Просмотреть файл

@ -329,6 +329,7 @@ struct pair { // store a pair of values
}
#if _HAS_CXX23
template <int = 0> // see GH-3013
constexpr void swap(const pair& _Right) const
noexcept(is_nothrow_swappable_v<const _Ty1>&& is_nothrow_swappable_v<const _Ty2>) {
if (this != _STD addressof(_Right)) {

Просмотреть файл

@ -9,8 +9,10 @@
#include <queue>
#include <set>
#include <stack>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
#if _HAS_CXX20
@ -50,3 +52,7 @@ struct __declspec(dllexport) ExportedStack : stack<int> {};
struct __declspec(dllexport) ExportedSpan : span<int> {};
struct __declspec(dllexport) ExportedSpanThree : span<int, 3> {};
#endif // _HAS_CXX20
// Test GH-3013 "<utility>: pair::swap(const pair&) interacts badly with __declspec(dllexport)"
struct __declspec(dllexport) ExportedPair : pair<int, int> {};
struct __declspec(dllexport) ExportedTuple : tuple<int, int, int> {};