Q:

Перегрузка оператора ->

Как то не логично работает вызов под номером 1, теряется уровень косвенности, ведь возвращается указатель, почему к нему сразу можно применить вызов функции, с номером 2 все понятно.
#include <iostream>

template <typename T>
class SmartPointer
{
    T *m_obj;
public:

    SmartPointer(T *obj) : m_obj(obj) { }

    ~SmartPointer() { delete m_obj; }

    T* operator->() { return m_obj; }

    T& operator* () { return *m_obj; }
};

class Show
{
public:
    void Do() { std::cout << "Show"; }
};

int main(int argc, char* argv[] )
{
    SmartPointer<Show> sP{new Show{} };

    sP->Do();                 // 1
    sP.operator->()->Do();    // 2

    return 0;
}

A:

Как я понимаю, действует п. 13.3.1.2.8
При выборе функции-операции operator-> второй операнд операции -> игнорируется и не считается аргументом вызова функции-операции operator->. Когда операция -> завершается, к возвращаемому значению применяется операция -> с исходным вторым операндом в качестве аргумента
и примечание к нему
Если значение, возвращаемое функцией-операцией operator->, имеет классовый тип, то в результате может быть выбрана и вызвана другая функция-операция operator->. Этот процесс повторяется, пока очередная функция-операция operator-> не возвратит значение неклассового типа.
Просто согласно правилам языка за -> не может следовать -> :)

