Почему Glibmm/Gtkmm не включает унарный оператор разыменования * для Glib::RefPtr?

Glib::RefPtr позволяет разыменовывать через '->', но не через '*'. Почему это?

Я, конечно, могу:

 class Foo {};
 Glib::RefPtr<Foo> fooPtr;

 fooPtr.operator->();

В документах специально упоминается, что оператор *() исключен. Но они не предлагают никаких указаний относительно того, почему.

Отредактировано с примером для ясности :

Я видел, как утверждалось, что «вам никогда не нужно разыменовывать» RefPtr, но IMO это кажется фиктивнымнелогично, так как любая функция, которая хочет использоваться как с динамически размещаемыми объектами, так и с объектами, размещенными в стеке, нуждается в интерфейсе с наименьшим общим знаменателем, т. е. передаче по ссылке.

Возьмем, к примеру, следующий пример:

struct Foo 
{ 
    void print() { printf( "Success" ); } 
};

void myFunc( const Foo & foo ) { foo.print(); }

int main()
{
    Foo               foo0;
    Glib::RefPtr<Foo> foo1Ptr( new Foo );

    myFunc(  foo0    );
    myFunc( *foo1Ptr ); // error, no operator*()

    return 0;
}

Кто-нибудь знает, почему команда Glib занимает такую ​​позицию?

10
задан Catskul 27 March 2019 в 15:21
поделиться