使用make_shared的简短方法?

时间:2013-08-31 15:10:47

标签: c++11

我现在要熟悉C ++ 11的功能。我自发喜欢的一件事是智能指针,特别是shared_ptr。但是它似乎不允许为shared_ptr分配普通指针,即。例如

typedef shared_ptr<string> StringPtr
...
StringPtr x;
...
x = new string("bla");

失败了,至少在VC2010中,当我查看shared_ptr::operator=中缺少模板参数类型的普通指针的重载的接口时,我当然可以理解这一点。现在我可以通过明确地使用shared_ptr构造函数从普通指针创建shared_ptr,即

x = StringPtr(new string("bla"));

但在我看来,这是多余的,反直觉的。我认为在为智能指针分配普通指针时,我已经尽可能地表达了我的编程意图。任何其他语法都会降低可读性,而不会获得太多清晰度。当然,我不应该将已经“拥有”的普通指针分配给智能指针,但是那样......

在尝试恢复可读性时,我偶然发现make_shared<>。但接下来又行了

x = make_shared<string>("bla");

比上面的智能指针的显式构造更具可读性和紧凑性。当然性能可能会好一点,但那不是我追求的。所以我的目的是实例化和别名函数模板make_shared,就像我为shared_ptr所做的那样。但显然

typedef make_shared<string> NewString

根本无效。所以我的问题是:我怎样才能最接近写像

这样的东西
x = NewString("bla");

1 个答案:

答案 0 :(得分:1)

这不起作用的原因:

typedef make_shared<string> NewString

是因为make_shared不是类型,它是函数。所以如果你真的想“重命名”这个,那就为它做一个包装函数。

typedef shared_ptr<string> StringPtr

StringPtr NewString(const char* str)
{
    return make_shared<string>(str);
}

int main()
{
    StringPtr x = NewString("bla"); // works
}

但是,请注意,make_shared现在基本上是C ++中的“标准词汇”,所以当有人遇到make_shared时,他们(应该)立即知道它的作用。虽然NewString虽然名称提示其功能,但与make_shared相比仍然相对未知,并且最初必须查看源文件或某种文档。


旁注:shared_ptr s不允许分配原始指针,因为它不安全。

shared_ptr的工作方式是它分配一个额外的控制数据结构,该结构保存引用计数(以及删除器之类的其他内容)。 此控件数据结构与对象本身分开。只给出一个任意的原始指针,就不可能确定是否已经有一个与它关联的shared_ptr控制数据结构。因此,允许原始指针赋值可以使对象具有两个或多个与之关联的控制数据结构,每个控制数据结构具有不同的引用计数。