11

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 团队为什么要担任这个职位吗?

4

1 回答 1

5

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

不,如果一个对象应该通过 RefPtr 使用,那么在没有 RefPtr 的情况下,任何函数都不会(或任何函数都不应该)使用它。没有 operator* 可以避免人们这样做,这意味着 API 被迫正确,这意味着由于不使用 RefPtr 而导致的内存管理错误更少。它不存在是因为人们会滥用它,而且人们已经很难掌握智能指针的窍门了。

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

于 2012-05-26T10:22:55.987 回答