3

有什么区别

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

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

需要详细解释。

4

2 回答 2

5

对于这种特殊情况,差异为零。这两个声明是完全等价的。


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

最普遍的情况是这样的:

U makeU();

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

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

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

T copy(T(makeU()))

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

U当is发生时,会发生更特殊的情况T

T makeT();

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

在这种情况下,这两者几乎是等价的。两者都使用复制/移动构造函数TT. makeT唯一的区别是,direct即使声明了它的复制/移动构造函数,它也会起作用explicit,而copy在这种情况下会出错。

当您在变量声明中替换T为时auto,您会得到原始案例。并且由于std::shared_ptr没有标记的复制和移动构造函数explicit,这两行是完全等价的。

于 2016-08-24T14:40:18.313 回答
3

因为std::shared_ptr<T>有一个可访问的、非显式的复制构造函数,所以没有什么区别。

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

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

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

汇编代码

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

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

汇编代码

于 2016-08-24T14:41:30.100 回答