标签: customization-point

为什么在定义自定义点对象时需要删除函数?

从 libstdc++<concepts>头文件:

  namespace ranges
  {
    namespace __cust_swap
    {
      template<typename _Tp> void swap(_Tp&, _Tp&) = delete;
Run Code Online (Sandbox Code Playgroud)

从 MS-STL<concepts>标头:

namespace ranges {
    namespace _Swap {
        template <class _Ty>
        void swap(_Ty&, _Ty&) = delete;
Run Code Online (Sandbox Code Playgroud)

我从未遇到过= delete;要禁止调用复制/移动赋值/ctor 的上下文之外的情况。

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

// template<typename _Tp> void swap(_Tp&, _Tp&) = delete;
Run Code Online (Sandbox Code Playgroud)

看看下面的测试用例是否编译。

#include <concepts>
#include <iostream>

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

int main()
{
    int a{};
    int …
Run Code Online (Sandbox Code Playgroud)

c++ stl language-lawyer c++20 customization-point

11
推荐指数
2
解决办法
305
查看次数

为什么std :: swap不使用swap idiom?

正确使用std :: swap是:

using std::swap;
swap(a,b);
Run Code Online (Sandbox Code Playgroud)

它有点冗长,但它确保如果a,b有更好的交换定义它将被选中.

所以现在我的问题是为什么std::swap没有使用这种技术实现,所以用户代码只需要调用std::swap

所以这样的事情(noexcept为了简洁而忽略和约束):

namespace std {
    namespace internal {
        template <class T>      // normal swap implementation
        void swap(T& a, T& b) { // not intended to be called directly
            T tmp = std::move(a);
            a = std::move(b);
            b = std::move(tmp);
        }
    }

    template <class T>
    void swap(T& a, T& b) {
        using internal::swap;
        swap(a,b);
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ template-function argument-dependent-lookup customization-point

8
推荐指数
1
解决办法
340
查看次数