正确实现IS_STD_SWAPPABLE

Correct implementation of is_std_swappable

本文关键字:STD SWAPPABLE IS 实现      更新时间:2023-10-16

这不是要对实现可交换概念测试的适当方法的副本?特别是关于"对可交接概念的测试"的方面。

我尝试实现特质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::stringstatic_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的非移动实现。另一方面,使用交换会产生错误("尝试引用已删除函数"):

    void foo() {
        DontMove dm;
        std::swap( dm, dm );
    }
    

谁在这里?还是我在is_std_swappable有缺陷的尝试?

标准不需要std::swap对Sfinae友好。它也不会阻止它。

都不是错误的。