构造共享指针的任何区别
any difference in constructing shared pointer
有什么区别
auto sp = std::make_shared<Foo>();
auto sp(std::make_shared<Foo>());
需要详细说明。
对于这种特殊情况,差异为零。这两个声明是完全等价的。
现在添加更多上下文(假设 T
和 U
是类型)。
最一般的情况是这样的:
U makeU();
T direct(makeU());
T copy = makeU();
在这种情况下,第一行是直接初始化。 T
需要一个接受U
或[=14=的东西的构造函数] 可以隐式转换。
第二行是复制初始化。编译器在概念上将其重写为:
T copy(T(makeU()))
即,从 U
对象初始化临时 T
,然后将临时 T
移动(或复制)到 copy
。这意味着 T
需要与 direct
相同的构造函数,外加一个可访问的非显式复制或移动构造函数。
当 U
是 T
:
时,会出现稍微特殊的情况
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>();
示例 #2(直接初始化):
auto sp(std::make_shared<Foo>());
有什么区别
auto sp = std::make_shared<Foo>();
auto sp(std::make_shared<Foo>());
需要详细说明。
对于这种特殊情况,差异为零。这两个声明是完全等价的。
现在添加更多上下文(假设 T
和 U
是类型)。
最一般的情况是这样的:
U makeU();
T direct(makeU());
T copy = makeU();
在这种情况下,第一行是直接初始化。 T
需要一个接受U
或[=14=的东西的构造函数] 可以隐式转换。
第二行是复制初始化。编译器在概念上将其重写为:
T copy(T(makeU()))
即,从 U
对象初始化临时 T
,然后将临时 T
移动(或复制)到 copy
。这意味着 T
需要与 direct
相同的构造函数,外加一个可访问的非显式复制或移动构造函数。
当 U
是 T
:
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>();
示例 #2(直接初始化):
auto sp(std::make_shared<Foo>());