函数需要返回指向StructA
的shared_ptr
。什么是一个好的返回类型`boost :: shared_ptr <StructA>`?
struct StructA
{
// complicated struct that also holds other sub-structure
....
};
const boost::shared_ptr<const StructA&>& GetStructA(...)
{...} #0.5
const boost::shared_ptr<const StructA>& GetStructA(...)
{...} #0
const boost::shared_ptr<StructA>& GetStructA(...)
{...} #1
const boost::shared_ptr<StructA> GetStructA(...)
{...} #2
boost::shared_ptr<const StructA>
{...} #3
boost::shared_ptr<StructA> GetStructA(...)
{...} #4
boost::shared_ptr<StructA>& GetStructA(...)
{...} #5
boost::shared_ptr<StructA&> GetStructA(...)
{...} #6
有这么多的选择,我相信他们中的一个是最好的(请指出,如果还有人左)。
就个人而言,我更喜欢使用#0
const boost::shared_ptr<const StructA&>& GetStructA(...)
{...} #0
遗留系统使用#2
const boost::shared_ptr<StructA> GetStructA(...)
{...} #2
为什么我宁愿选择#0是如下原因:
返回常量shared_ptr的,使得该函数的调用者不应改变返回的shared_ptr其可以指向内部数据结构
返回通过引用,这样我可以避免+/-的shared_ptr的引用计数的
shared_ptr保存const StructA &,以便调用方不能更改const shared_ptr的内容。如果我是对的,即使shared_ptr是const,它也不能阻止调用者改变指向的数据,除非数据是const。
请
- 纠正我的理解,如果我没有犯错
- 提供此功能的最好回报签名。
谢谢
你不想让他做shared_ptr'X =其他值'或者你不想'(* X)=其他值'? – RedX 2012-07-25 15:26:12
2>这是*非常危险*,通过颠覆共享指针的整个目的。你现在有一个指针,认为它被使用了3次,但是真的被使用了6,并且在3次发布(segfault)后使用时不会抛出。它也可能尝试自我释放6次,因为示波器在每个参考上都会关闭。 – ssube 2012-07-25 15:28:06
我甚至没有意识到它是合法的*使共享指针包含引用类型... Eeevil – jalf 2012-07-25 15:33:30