这并非要与What is a proper way to implement is_swappable to test for the Swappable concept?重复,特别是在“测试 Swappable 概念”方面。
我尝试实现特征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, "" );
结果(请参见https://godbolt.org/z/014kJ2)
Clang 7.0.0在此处看到错误(“ static_assert由于要求而失败
is_std_swappable<DontMove>::value
”。
MSVC 19.16没有错误。如果MSVC提供了
std::swap
的固定执行。另一方面,使用
swap会产生错误(“试图引用已删除的函数”):
void foo() {
DontMove dm;
std::swap( dm, dm );
}
谁在这里?还是我对is_std_swappable
的尝试有问题?
答案 0 :(得分:1)
该标准不需要std::swap
是SFINAE友好的。也不能阻止它。
两个编译器都没有错。