为什么在定义自定义点对象时删除功能是必要的? 交换/ iter_swap 开始/结束

问题描述

来自libstdc ++ <concepts>标头:

  namespace ranges
  {
    namespace __cust_swap
    {
      template<typename _Tp> void swap(_Tp&,_Tp&) = delete;

来自MS-STL <concepts>标头:

namespace ranges {
    namespace _Swap {
        template <class _Ty>
        void swap(_Ty&,_Ty&) = delete;

在您要禁止调用复制/移动作业/控制器的上下文之外,我从未遇到过= delete;

我很好奇是否有必要,所以我像这样从库中注释掉了= delete;部分:

// template<typename _Tp> void swap(_Tp&,_Tp&) = delete;

查看以下测试用例是否可以编译。

#include <concepts>
#include <iostream>

struct dummy {
    friend void swap(dummy& a,dummy& b) {
        std::cout << "ADL" << std::endl;
    }
};

int main()
{
    int a{};
    int b{};
    dummy c{};
    dummy d{};
    std::ranges::swap(a,b);
    std::ranges::swap(c,d); // Ok. Prints "ADL" on console.
}

不仅可以编译,而且可以通过为swap调用用户定义的struct dummy来表现良好。所以我想知道,

  1. template<typename _Tp> void swap(_Tp&,_Tp&) = delete;在此情况下到底能做什么?
  2. 在没有 template<typename _Tp> void swap(_Tp&,_Tp&) = delete;的情况下此中断什么时候出现?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)