构造共享指针的任何区别

any difference in constructing shared pointer

有什么区别

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

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

需要详细说明。

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


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

最一般的情况是这样的:

U makeU();

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

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

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

T copy(T(makeU()))

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

UT:

时,会出现稍微特殊的情况
T makeT();

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

在这种情况下,这两个几乎是等价的。两者都使用 copy/move 构造函数从 makeT 返回的临时 T 初始化声明的 T。唯一的区别是 direct 即使其 copy/move 构造函数被声明为 explicit 也会工作,而 copy 在这种情况下会出错。

当您在变量声明中将 T 替换为 auto 时,您将得到原始大小写。并且由于 std::shared_ptr 的复制和移动构造函数未标记 explicit,因此这两行完全等价。

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

如果您生成汇编代码,您会发现对于这两个示例,编译器将生成相同的程序集。

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

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

Assembly Code

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

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

Assembly Code