最好返回C++引用或weak_ptr?

Dou*_* T. 12 c++ boost reference

假设我有一个类,我希望用户能够引用我的一个成员.哪个更受欢迎?

class Member;

class ClassWithWeakPtr
{
private:
   boost::shared_ptr<Member> _member;
public:
   boost::weak_ptr<Member> GetMember();
};
Run Code Online (Sandbox Code Playgroud)

要么

class Member;

class ClassWithCppReference
{
private:
    Member _member;
public:
    Member& GetMember() {return _member;}
};
Run Code Online (Sandbox Code Playgroud)

你怎么看?什么时候比另一个更好?

Mic*_*urr 13

为什么不回来shared_ptr<>?那么客户端可以根据需要使用返回的内容,但是如果"服务器"类消失则没有问题.

没有太多情况下语义weak_ptr<>很有意义(缓存和???).通常当客户要求某事时,它希望拥有由客户自己确定的那个东西(并且共享所有权和完全所有权一样好).

如果你有一个情况,可以在不知道客户端的情况下销毁'server'对象(你可能想要的情况use weak_ptr<>或者shared_ptr<>),你可以做的最糟糕的事情是返回对成员的引用.在这种情况下,客户端无法知道访问返回的引用是否安全.您必须返回该成员的副本或智能指针,该指针可以正确地管理所返回成员的生命周期.

请记住,如果有一个表达式产生一个临时表ClassWithCppReference(并不总是很明显),那么调用的客户端GetMember()甚至不能在下一个语句中使用返回的引用.


Dou*_* T. 0

我的基本的、无知的指导方针:

我意识到,如果 ClassWithCppReference 的实例可能消失,而某人仍然拥有对成员的引用,则后者可能不安全。但是,我还可以看到后一个类具有 POD 类型的参数,例如发送到设备的消息,并且您不想一直复制该成员。