gpt4 book ai didi

c++ - is_std_swappable 的正确实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:41 26 4
gpt4 key购买 nike

这不是 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< 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 友好。它也不会阻止它。

编译器都没有错。

关于c++ - is_std_swappable 的正确实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54771457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com