按值返回的临时shared_ptr 的计数器是否递增?

Mix*_*ira 3 c++ shared-ptr return-value-optimization

我试图了解 RVOshared_ptr在这种特殊情况下如何结合使用。

\n

假设我有这个示例代码:

\n
class A {\npublic:\n  void action() {}\n};\n\nclass Container {\npublic:\n  shared_ptr<A> getA() { return m_a; }\n\nprivate:\n  shared_ptr<A> m_a;\n};\n\nContainer cont{};\ncont.getA()->action();\n
Run Code Online (Sandbox Code Playgroud)\n

如果我没记错的话,在这种情况下,不应复制/复制构造shared_ptr返回的getA()xe2\x80\x99,因为它是由编译器优化的。\n因此,在最后一行中,我shared_ptr调用action()的函数应该是直接包含在对象m_a内部的那个Container

\n

这样的话,如果指针没有被复制,那么内部引用计数是不是不会递增/递减呢?

\n

因为我将它用作右值,所以它经过了优化,我可以直接使用它来访问指向的对象,而不需要任何成本,就像原始指针一样?

\n

如果不是这样,有没有办法避免增加/减少的成本?我实际上并没有保留shared_ptr,但我仅将它用于对所包含的对象进行操作。

\n

或者,所包含对象的生命周期可能存在任何问题?

\n

Ted*_*gmo 7

\n

getA() 返回的shared_ptr 不应该被复制/复制构造,因为它被编译器优化了。

\n
\n

是的,它将被复制。m_a不是局部变量,因此无法完成 NRVO(名为返回值优化),并且按值返回它确实会复制构造返回的shared_ptr<A>.

\n

演示

\n