在 returning 成员变量的情况下,编译器是否执行 return 值优化?

Does the compiler perform return value optimisation in case of returning member variable?

给定以下代码

class foo
{
    private:
        boost::shared_ptr <std::deque<foo> > m_ptr;
    public:
        foo();
        boost::shared_ptr <std::deque<foo> > get_my_ptr()
        {
            return m_ptr;
        }
};

当我们像这样调用get_my_ptr()函数时

boost::shared_ptr <std::deque<foo> > ptr = get_my_ptr()

编译器是调用复制构造函数创建ptr对象还是执行nrvo? 和我们这样叫有什么区别

const boost::shared_ptr <std::deque<foo> >& ptr = get_my_ptr()

返回成员变量时,编译不得执行RVO。如果是这样,该对象将留下一个无效成员。

使用 NRVO,编译器可以省略复制和移动构造,如果 return 语句的表达式是具有自动存储持续时间的本地非易失性对象的名称,它不是函数参数。该本地对象直接在存储中构造,否则函数的 return 值将被复制到该存储中。 成员变量不满足这些条件。我只有在您创建成员的本地副本时才有可能:

boost::shared_ptr<std::deque<foo>> get_my_ptr()
{
    auto p = m_ptr;
    return p;
}

在您的示例中,将调用复制构造函数,这将增加共享指针的引用计数器。如果将 returned 对象绑定到 const 引用,也会发生同样的情况。