之间有什么区别
auto sp = std::make_shared<Foo>();
auto sp(std::make_shared<Foo>());
需要详细说明。
答案 0 :(得分:5)
对于这种特殊情况,没有区别。这两个声明是完全等效的。
现在添加更多上下文(假设T
和U
是类型)。
最常见的情况是:
U makeU();
T direct(makeU());
T copy = makeU();
在这种情况下,第一行是直接初始化。 T
需要一个构造函数,它接受U
或U
可以隐式转换的内容。
第二行是复制初始化。编译器在概念上将其重写为:
T copy(T(makeU()))
也就是说,从T
对象初始化临时U
,然后将临时T
移动(或复制)到copy
。这意味着T
需要与direct
相同的构造函数,以及可访问的非显式复制或移动构造函数。
当U
为T
时,会出现稍微更专业的情况:
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>();
示例#2(直接初始化):
auto sp(std::make_shared<Foo>());