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

问题描述 投票:10回答:1

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

我当然可以这样做:

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

 fooPtr.operator->();

文档特别提到他们离开了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团队会采取这个立场?

c++ gtk smart-pointers glib gtkmm
1个回答
5
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.