当前位置: 首页 > 知识库问答 >
问题:

正确实施is_std_swappable

凤伟泽
2023-03-14

这不是要重复实现is_swappable测试可交换概念的正确方法是什么?特别是关于“可交换概念的测试”方面。

我试图实现一个特征< code > is _ STD _ swapped :

#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::字符串static_assert(is_std_swappable

现在我尝试了一种类型,它不应该被std::交换交换,假设实现使用std::移动

struct DontMove {
    DontMove() = default;
    DontMove( DontMove&& ) = delete;
};

static_assert( is_std_swappable< DontMove >::value, "" );

结果(见 https://godbolt.org/z/014kJ2):

>

  • Clang 7.0.0 在此处看到一个错误(“由于要求is_std_swappable,static_assert失败

    MSVC 19.16不出错。如果MSVC提供< code>std::swap的非移动实现,这种情况可能会发生。另一方面,使用交换会产生错误(“试图引用已删除的函数”):

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

    谁在这里?还是我在< code > is _ STD _ swapped 上的尝试有问题?

  • 共有1个答案

    令狐宏伟
    2023-03-14

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

    这两个编译器都没有错。

     类似资料:
    • 我有一个结构如下的项目。 是我的主要应用程序,而和是导入到Project中的两个库。使用了的一些类,使用了的一些类。 在的文件中,我使用了。一切正常。但是,如果我用替换,它就不能从导入类。它给出错误。

    • 我正在使用这个库:https://tls.mbed.org/download用ESPRESIF ESP32。目标是使用AES-CTR加密一些数据,然后将密码文本解密回原始纯文本。我解密后得到的结果不正确。 因为我们使用的是CTR模式,所以不需要单独的“解密”功能;我们可以只调用一次encrypt函数进行加密,然后再调用同一个函数一次,它就会解密。至少,大多数消息来源都是这么说的,其他实现也是如此:

    • 问题内容: 我有一个名为User的域对象。用户的属性包括ssoId,名称,电子邮件,createdBy,createdDate和userRole。其中,ssoId必须是唯一的,因为两个用户不能具有相同的sso id。因此,我的equals方法检查sso id并返回true或false。 我认为这是一个错误的实现,尽管就业务规则而言是正确的。对于具有相同sso id但名称或电子邮件或两者具有不同值的

    • 问题内容: 我有两个版本的“按需初始化持有人惯用语”: http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom http://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh 两者之间的主要区别在于,第一个声明为 私有 ,而第二个声明为 公

    • 问题内容: 我尝试实现冒泡排序,但是不确定它是否正确。如果您可以看一下它,并且它是气泡式的,并且可以通过更好的方式完成,请不要害羞。这是代码: 问题答案: 这是冒泡排序的正常实现,似乎还可以。可以进行几种优化,但是总体思路是相同的。这里有一些想法: 如果在内循环中未执行任何交换时,外循环有一个迭代,则中断,无用继续 在外循环的每次迭代中,交换内循环的方向-从左至右执行一次,然后从右至左执行一次(这

    • 问题内容: 海 我想建立一个包含聊天的网站。我正在使用PHP,我想要一个代码来实现与php的聊天。有人可以帮助我做到这一点吗?我知道阿贾克斯。我不懂其他语言… 问题答案: 我们目前正在与LiveZilla合作,这非常好,这是公司唯一必须拥有Windows PC的东西。操作员界面位于“ .NET”上 livezilla

    • 有人能解释一下为什么我的启动/停止按钮不起作用吗?这不是一个完整的秒表,但我被困在这里。感谢您的帮助!这是我第一次在论坛上发帖,所以如果我的帖子有任何问题,请告诉我。这是我的代码:

    • 我坐下来试着实施脑力操。语法似乎很简单。我很难让这个愚蠢的东西发挥作用。我做这件事已经有一段时间了;我承认我需要一些睡眠。也许这就是问题所在。翻译没有输出任何东西。我很确定问题很简单;我知道,在我更好地掌握了这个程序的发展方向之后,我需要对一些函数调用进行模块化。为什么我没有得到输出? 是大脑操的“你好世界”