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

Cat*_*kul 10 c++ gtk smart-pointers glib gtkmm

Glib :: RefPtr允许通过' ->'但不通过' *' 解除引用.为什么是这样?

我当然可以这样做:

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

 fooPtr.operator->();
Run Code Online (Sandbox Code Playgroud)

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

为清晰起见,编写了示例:

我已经看到它认为" 你永远不需要取消引用 "一个RefPtr,但IMO似乎是虚假的,因为任何想要与动态和堆栈分配的对象一起使用的函数都需要最低的公分母接口,即pass-by -参考.

举个例子,例如:

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;
}
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么这个位置是由Glib团队采取的?

mur*_*ayc 5

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

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

如果您有一个真正的问题,认为可以通过RefPtr :: operator *()解决,那么您可能会提到实际问题,因此我们可以(大概)证明您真的不想在这里使用operator *() 。

  • 不,没有可以同时使用的 glibmm 或 gtkmm 类型(使用 RefPtr 或不使用 RefPtr)。如果您看到任何其他提示,请告诉我们,以防您刚刚发现错误。当然,其他 gtkmm 类型(绝不应该通过 RefPtr 使用),例如 Widget,可以动态分配或在堆栈上分配,就像任何其他 C++ 类一样。 (2认同)
  • 如果小部件是顶级小部件(例如窗口或对话框),则 unique_ptr&lt;&gt; 可能确实有用,但子小部件是被创建的(参见 Gtk::manage())。Gtk::Builder::get_widget() 文档提到了这一点:https://developer.gnome.org/gtkmm/stable/classGtk_1_1Builder.html#ae525dfa187377dcdc1179a52df3d160a (2认同)