Disable std::swap specialization in C++20 and added a friend swap function
This commit is contained in:
		
							parent
							
								
									7444c7fa25
								
							
						
					
					
						commit
						225c8f150a
					
				
					 3 changed files with 76 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -2048,7 +2048,11 @@ JSON_HEDLEY_DIAGNOSTIC_POP
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
// C++ language standard detection
 | 
			
		||||
#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
 | 
			
		||||
#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
 | 
			
		||||
    #define JSON_HAS_CPP_20
 | 
			
		||||
    #define JSON_HAS_CPP_17
 | 
			
		||||
    #define JSON_HAS_CPP_14
 | 
			
		||||
#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
 | 
			
		||||
    #define JSON_HAS_CPP_17
 | 
			
		||||
    #define JSON_HAS_CPP_14
 | 
			
		||||
#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -21628,6 +21632,34 @@ class basic_json
 | 
			
		|||
    /*!
 | 
			
		||||
    @brief exchanges the values
 | 
			
		||||
 | 
			
		||||
    Exchanges the contents of the JSON value from @a left with those of @a right. Does not
 | 
			
		||||
    invoke any move, copy, or swap operations on individual elements. All
 | 
			
		||||
    iterators and references remain valid. The past-the-end iterator is
 | 
			
		||||
    invalidated. implemented as a friend function callable via ADL.
 | 
			
		||||
 | 
			
		||||
    @param[in,out] left JSON value to exchange the contents with
 | 
			
		||||
    @param[in,out] right JSON value to exchange the contents with
 | 
			
		||||
 | 
			
		||||
    @complexity Constant.
 | 
			
		||||
 | 
			
		||||
    @liveexample{The example below shows how JSON values can be swapped with
 | 
			
		||||
    `swap()`.,swap__reference}
 | 
			
		||||
 | 
			
		||||
    @since version 1.0.0
 | 
			
		||||
    */
 | 
			
		||||
    friend void swap(reference left, reference right) noexcept (
 | 
			
		||||
        std::is_nothrow_move_constructible<value_t>::value and
 | 
			
		||||
        std::is_nothrow_move_assignable<value_t>::value and
 | 
			
		||||
        std::is_nothrow_move_constructible<json_value>::value and
 | 
			
		||||
        std::is_nothrow_move_assignable<json_value>::value
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
        left.swap(right);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
    @brief exchanges the values
 | 
			
		||||
 | 
			
		||||
    Exchanges the contents of a JSON array with those of @a other. Does not
 | 
			
		||||
    invoke any move, copy, or swap operations on individual elements. All
 | 
			
		||||
    iterators and references remain valid. The past-the-end iterator is
 | 
			
		||||
| 
						 | 
				
			
			@ -24398,6 +24430,9 @@ struct less<::nlohmann::detail::value_t>
 | 
			
		|||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// C++20 prohibit function specialization in the std namespace.
 | 
			
		||||
#ifndef JSON_HAS_CPP_20
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
@brief exchanges the values of two JSON objects
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -24412,6 +24447,8 @@ inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcep
 | 
			
		|||
    j1.swap(j2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace std
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue