构造共享指针的任何区别

时间:2016-08-24 14:29:56

标签: c++11 shared-ptr make-shared

之间有什么区别
auto sp = std::make_shared<Foo>();

auto sp(std::make_shared<Foo>());

需要详细说明。

2 个答案:

答案 0 :(得分:5)

对于这种特殊情况,没有区别。这两个声明是完全等效的。

现在添加更多上下文(假设TU是类型)。

最常见的情况是:

U makeU();

T direct(makeU());
T copy = makeU();

在这种情况下,第一行是直接初始化。 T需要一个构造函数,它接受UU可以隐式转换的内容。

第二行是复制初始化。编译器在概念上将其重写为:

T copy(T(makeU()))

也就是说,从T对象初始化临时U,然后将临时T移动(或复制)到copy。这意味着T需要与direct相同的构造函数,以及可访问的非显式复制或移动构造函数。

UT时,会出现稍微更专业的情况:

T makeT();

T direct(makeT());
T copy = makeT();

在这种情况下,这两者几乎相同。两者都使用复制/移动构造函数初始化T返回的临时T中声明的makeT。唯一的区别是direct即使其复制/移动构造函数被声明为explicit也会起作用,而copy在这种情况下会出错。

如果在变量声明中将T替换为auto,则会得到原始案例。由于std::shared_ptr的复制和移动构造函数未标记为explicit,因此这两行完全等效。

答案 1 :(得分:3)

由于std::shared_ptr<T>具有可访问的非显式复制构造函数,因此没有任何区别。

如果生成汇编代码,您将看到两个示例中的编译器将生成相同的汇编。

示例#1(复制初始化):

auto sp = std::make_shared<Foo>();

Assembly Code

示例#2(直接初始化):

auto sp(std::make_shared<Foo>());

Assembly Code