正确实现is_std_swappable

时间:2019-02-19 17:03:43

标签: c++ c++11 visual-c++

这并非要与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的尝试有问题​​?

1 个答案:

答案 0 :(得分:1)

该标准不需要std::swap是SFINAE友好的。也不能阻止它。

两个编译器都没有错。