-> использование в умных указателях

У меня есть простая реализация интеллектуального указателя, показанная во фрагменте кода 1 ниже. И фиктивный тестовый класс с именем Dummy во втором фрагменте. Фрагмент кода 3 показывает, как мы можем использовать этот простой умный указатель для доступа к функции foo ().

Мой вопрос о том, как мы вызываем функцию foo () в классе Dummy с помощью оператора ->. Оператор -> уже возвращает указатель на необработанный указатель. Поэтому, я думаю, для того, чтобы мы могли вызывать функцию foo (), нам нужно выполнить вторую операцию -> с возвращенным необработанным указателем. Тем не менее, многие ресурсы говорят, что одного использования оператора -> достаточно просто.

Вкратце, я думаю, что правильный вызов должен выглядеть следующим образом: (dummy ->) -> foo ();

Тем не менее, вызов как этот dummy-> foo () работает нормально. Может кто-нибудь объяснить мне, почему (dummy ->) -> foo () неверно? Возможно, у меня есть концептуальное недоразумение, но я хотел бы знать концепцию правильно.

КОД SNIPPET 1 (класс SMART POINTER)

template <typename T>
class SmartPointer
{
 private:
    T* mRawPointer;

 public:
    SmartPointer(T* thePointer) : mRawPointer(thePointer) {}
    ~SmartPointer() { delete mRawPointer;}

    T& operator* () const { return *mRawPointer; }

    T* operator-> () const { return mRawPointer; }

};

КОД SNIPPET 2 (Класс манекен)

class Dummy
{
 public:
   foo() {......}
};

КОД SNIPPET 3 (ЗАКОНОДАТЕЛЬНЫЕ АЛЬТЕРНАТИВЫ В ВОПРОСЕ)

SmartPointer<Dummy> dummy(new Dummy());

(dummy->)->func(); 
//I think the above is correct cause we need to make a second dereference on the 
//returned raw pointer
//OR
dummy->func();

Ответы на вопрос(2)

Ваш ответ на вопрос