有什么区别
auto sp = std::make_shared<Foo>();
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
需要一个接受 aU
或U
可以隐式转换的东西的构造函数。
第二行是复制初始化。编译器在概念上将其重写为:
T copy(T(makeU()))
也就是说,T
从对象初始化一个临时U
对象,然后将该临时对象T
移动(或复制)到copy
. 这意味着它T
需要与 for 相同的构造函数direct
,以及可访问的非显式复制或移动构造函数。
U
当is发生时,会发生更特殊的情况T
:
T makeT();
T direct(makeT());
T copy = makeT();
在这种情况下,这两者几乎是等价的。两者都使用复制/移动构造函数T
从T
. makeT
唯一的区别是,direct
即使声明了它的复制/移动构造函数,它也会起作用explicit
,而copy
在这种情况下会出错。
当您在变量声明中替换T
为时auto
,您会得到原始案例。并且由于std::shared_ptr
没有标记的复制和移动构造函数explicit
,这两行是完全等价的。