1

目前我即将熟悉 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");

?

4

1 回答 1

2

这不起作用的原因:

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_ptrs 不允许分配原始指针,因为这是不安全的。

工作方式shared_ptr是它分配一个额外的控制数据结构来保存引用计数(以及其他东西,如删除器)。这个控制数据结构与对象本身是分开的。仅给定一个任意的原始指针,就无法确定是否已经存在shared_ptr与之关联的控制数据结构。因此,允许原始指针分配使得一个对象有可能拥有两个或多个与之关联的控制数据结构,每个结构具有不同的引用计数。

于 2013-08-31T15:33:18.963 回答