代码之家  ›  专栏  ›  技术社区  ›  user25687822

如何在C++中实现自定义UniquePtr类的运算符->?复制

  •  0
  • user25687822  · 技术社区  · 1 年前

    我正在尝试用C++编写我自己的unique_ptr实现,下面是我的UniquePtr头文件:

    #include <iostream>
    
    template <typename T>
    class UniquePtr
    {
        T* ptr;
    
    public:
        UniquePtr(T* _ptr);
    
        UniquePtr(const UniquePtr& other) = delete;
        UniquePtr& operator=(const UniquePtr& other) = delete;
    
        UniquePtr(UniquePtr&& dying) noexcept;
        UniquePtr& operator=(UniquePtr&& dying) noexcept;
    
        T& operator*();
        const T& operator*() const;
    
        /*??? operator->() 
        {
    
        }*/
    
        /*??? operator->() const
        {
    
        }*/
    
        ~UniquePtr();
    };
    
    

    我对什么运算符感到困惑->应该返回。我知道uniquePtr形式的调用->member被翻译成(*uniquePtr).member,但这仍然不能帮助我理解运算符是什么->应该返回。

    我知道运算符基本上都是有特殊名称的函数,所以我们可以想到->作为一个只接受一个参数的函数——指向对象的指针(所有成员函数都会得到)。然而,我有点困惑于调用uniquePtr->成员应该规定我们在类中重写它的方式(它的返回类型应该是什么)。

    有人能解释一下如何实现运算符吗;对于这个自定义的UniquePtr类,为什么要这样实现?

    这并不能回答我的问题:

    What are the basic rules and idioms for operator overloading?

    1 回复  |  直到 1 年前
        1
  •  1
  •   user17732522    1 年前

    我知道uniquePtr形式的调用->成员被翻译为(*uniquePtr).member

    这就是的行为 内置的 -> 操作人员如果选择重载,编译器将进行转换

    uniquePtr->member
    

    (uniquePtr.operator->())->member
    

    对于新引入的 -> 操作人员

    你希望这会导致 (uniquePtr.ptr)->member ,在扩展了内置 -> (*(uniquePtr.ptr)).member 。所以你想要你的 operator->() 简单地返回 ptr 。返回类型应与 const -过载的鉴定。

    还要注意的是 -> 当选择我上面解释的操作员过载时 -> 并且不同于任何其它二进制运算符。这不是你可以从关于二进制运算符重载的一般规则中推导出来的。