【问题标题】:Correct implementation of is_std_swappableis_std_swappable 的正确实现
【发布时间】:2019-02-19 17:03:42
【问题描述】:

这不是What is a proper way to implement is_swappable to test for the 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::stringstatic_assert( is_std_swappable&lt; std::string &gt;::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 failed due to requirements is_std_swappable&lt;DontMove&gt;::value")。

  • MSVC 19.16 不会出错。如果 MSVC 提供了 std::swap 的不动实现。另一方面,使用 交换产生错误(“试图引用已删除的函数”):

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

谁在这里?还是我对is_std_swappable 的尝试有问题​​?

【问题讨论】:

  • 失败的原因在 this answer 中解释。我把它当作一个骗子,因为它也提供了解决方法
  • 不清楚这是否“失败”。编译器在这里的行为不同。我试图在godbolt.org/z/NQajmI 中重现其他解决方案。结果相同。所以这可能不是the other question的重复。
  • 啊,我明白了。我想要“实例失败不是错误”而不是 SFINAE。

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


【解决方案1】:

该标准不要求 std::swap 对 SFINAE 友好。它也不会阻止它。

编译器都没有错。

【讨论】:

  • 我必须先了解 SFINAE 的友好性。现在我将不得不在 libc++ 中寻找std::swap 的实现。
猜你喜欢
  • 2010-10-05
  • 2010-10-15
  • 2018-02-10
  • 2011-10-18
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多