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 занимает такую позицию?