Это не является дубликатом Как правильно реализовать is_swappable для тестирования концепции Swappable? , особенно в отношении аспекта "тестирования для Swappable concept".
Я пытался реализовать черту is_std_swappable
:
#include <type_traits>
#include <utility>
template< typename T, typename = void >
struct is_std_swappable : std::false_type {};
template< typename T >
struct is_std_swappable< T, decltype( std::swap( std::declval< T& >(), std::declval< T& >() ) ) > : std::true_type {};
Это работает для std::string
и static_assert( is_std_swappable< std::string >::value, "" );
не приводит к ошибке.
Теперь я попробовалтип, который не должен заменяться std::swap
при условии реализации, использующей std::move
:
struct DontMove {
DontMove() = default;
DontMove( DontMove&& ) = delete;
};
static_assert( is_std_swappable< DontMove >::value, "" );
Result (см. https://godbolt.org/z/014kJ2):
Clang 7.0.0видит здесь ошибку («static_assert не удалось из-за требования is_std_swappable<DontMove>::value
»).
MSVC 19.16 не выдает ошибку. Это может произойти, если MSVC предоставляет постоянную реализацию std::swap
С другой стороны, использование свопа приводит к ошибке («попытка сослаться на удаленную функцию»):
void foo() {
DontMove dm;
std::swap( dm, dm );
}
Кто здесь? Или моя попытка на is_std_swappable
неисправен?