C++11 使用make_共享的较短方法?

C++11 使用make_共享的较短方法?,c++11,C++11,我现在就要熟悉C++11的特性了。我很喜欢智能指针,尤其是shared\u ptr。但是,它似乎不允许将普通指针分配给共享的ptr,例如 typedef shared_ptr<string> StringPtr ... StringPtr x; ... x = new string("bla"); 但在我看来,这是多余的和违反直觉的。我认为,在将普通指针指定给智能指针时,我已经尽可能多地表达了我的编程意图。任何附加语法都会降低可读性,但不会获得太多的清晰度。当然,这取决于我不分配一

我现在就要熟悉C++11的特性了。我很喜欢智能指针,尤其是
shared\u ptr
。但是,它似乎不允许将普通指针分配给共享的ptr,例如

typedef shared_ptr<string> StringPtr
...
StringPtr x;
...
x = new string("bla");
但在我看来,这是多余的和违反直觉的。我认为,在将普通指针指定给智能指针时,我已经尽可能多地表达了我的编程意图。任何附加语法都会降低可读性,但不会获得太多的清晰度。当然,这取决于我不分配一个已经“拥有”的普通指针到一个智能指针,但那又怎么样

在尝试恢复可读性时,我无意中发现了
make_shared
。但话说回来

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

?这不起作用的原因是:

typedef make_shared<string> NewString
<>但是,请注意,代码> MaxySuffy基本上是C++中的“标准词汇表”,所以任何人在进入代码> MaxySuffy时,都应该立即知道它所做的事情。然而,
NewString
,虽然名称暗示了它的功能,但与
make_shared
相比,它仍然相对未知,必须首先查看源代码或某种文档


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


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

在我的建议中,
std::make_shared(…)
不仅可读,它还明确地告诉你你在做什么。我已经编辑了你的题目的标题,以避免混淆,因为“专业化”在C++中有一个具体的定义,不适用于你的情况。Joachim Pileborg:基本上你是对的。这是品味的问题。但我不喜欢下划线,也不喜欢模板括号(但我当然喜欢模板!)。每当我试图弄清楚这条包含40个括号和20个模板括号的永不停歇的intellisense代码线试图告诉我表现不佳的大脑什么时,我就更加讨厌它了…@user2118609:你可能使用的是一个旧版本的C++11编译器,它不支持,这是
make_shared
接受任意数量的构造函数参数所必需的。较旧的库版本通过提供一系列模拟多个参数的重载来解决这个问题。我可以向你保证,在新版本中它会更干净。@silico:我很困惑。。。您所指的模板参数的倍数是多少?make_shared只有一个,函数参数“bla”也是单数。实际上,我正在尝试为模板函数或其他东西定义一个别名。非常感谢,在电子版上。现在我觉得自己有点傻,因为包装器函数太明显了。:-)也许我错过了这一点,因为我已经在c#编程太多了,全局函数是不允许的。至于安全问题:这可能是shared_ptr的设计者们的想法,但没有什么能阻止我写shared_ptr(另一个_shared_ptr.get())之类的东西,所以在我看来,安全完全是虚构的。。。任何可以做的虐待,总有一天会做的。@user2118609:没错,这不会阻止一个决心坚定的白痴。但它确实使不正确地使用
shared_ptr
s变得更加困难,这总是一件好事。
typedef make_shared<string> NewString
x = NewString("bla");
typedef make_shared<string> NewString
typedef shared_ptr<string> StringPtr

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

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