为什么Glibmm / Gtkmm不包括用于Gl​​ib :: RefPtr的一元解引用运算符*?

时间:2012-05-10 20:56:30

标签: c++ gtk smart-pointers glib gtkmm

Glib :: RefPtr允许通过“->”解除引用,但不能通过“*”解除引用。这是为什么?

我当然可以这样做:

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

 fooPtr.operator->();

文档特别提到他们离开了operator *()。但他们没有就原因提供任何指导。

为了清晰起见,使用示例编辑

我已经看到它认为“你永远不需要取消引用”一个RefPtr,但IMO似乎 bogus 违反直觉想要与动态和堆栈分配的对象一起使用的函数需要最小的公分母接口,即传递引用。

例如,举例如下:

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团队会采取这个立场?

1 个答案:

答案 0 :(得分:5)

  

某些函数可能将对象或对象引用作为参数。

不,如果一个对象应该通过RefPtr使用,那么没有RefPtr就没有函数(或者没有函数应该)。没有运算符*可以避免人们这样做,这意味着API被强制正确,这意味着由于不使用RefPtr而导致内存管理错误减少。它并不存在,因为人们会滥用它,人们已经有足够的时间来掌握智能指针。

如果你有一个你认为可以通过RefPtr :: operator *()解决的真正问题,那么你可能会提到实际问题所以我们可以(可能)展示你真的不想使用operator * ()那里。