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团队采取的?
某些函数可能将对象或对象引用作为args。
不,如果对象应该通过RefPtr使用,那么没有RefPtr,没有函数会(或者没有函数应该)使用它。没有运算符*避免了人们这样做,这意味着API被迫正确,这意味着由于不使用RefPtr而导致的内存管理错误更少。它之所以不存在,是因为人们会滥用它,并且人们已经有足够的时间来掌握智能指针了。
如果您有一个真正的问题,认为可以通过RefPtr :: operator *()解决,那么您可能会提到实际问题,因此我们可以(大概)证明您真的不想在这里使用operator *() 。
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |