有什么区别
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,这两行是完全等价的。