Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果返回成员变量,编译器是否执行返回值优化?_C++_Reference_Copy Constructor_Temporary Objects - Fatal编程技术网

C++ 如果返回成员变量,编译器是否执行返回值优化?

C++ 如果返回成员变量,编译器是否执行返回值优化?,c++,reference,copy-constructor,temporary-objects,C++,Reference,Copy Constructor,Temporary Objects,给定以下代码 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; } }; 编译器是调用复

给定以下代码

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;
        }
};
编译器是调用复制构造函数来创建ptr对象,还是可以执行nrvo? 我们这样称呼它有什么区别

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

当返回成员变量时,编译不能执行RVO。如果有,对象将保留一个无效成员。

对于NRVO,如果 return语句的表达式是具有自动存储持续时间的本地非易失性对象的名称,它不是函数参数。该本地对象直接在存储中构造,否则函数的返回值将复制到该存储中。 成员变量不满足这些条件。仅当您创建了成员的本地副本时,我才有可能:

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

在您的示例中,将调用copy ctor,这将增加共享指针的引用计数器。如果您将返回的对象绑定到常量引用,也会发生同样的情况。

“if it do”是一种边缘形而上学。您还可以想象对象最终会以某种方式与调用者共享其成员。@juanchopanza,这对于成员变量来说将是一次有趣的跋涉——被调用者和对象共享。究竟什么是
boost::shared
?我只熟悉
boost::shared_ptr
,对于为什么要持有一个成员变量“shared”,然后将其传递给调用方,我感到有些困惑。。。?!?抱歉,我已更正代码。好的,请忘记我(现在已删除)的评论。我不知道你在那里想干什么。一个类
foo
持有一个指向
std::deque
的共享指针,并在请求时将其传递出去?可能会完全删除共享的ptr,并使用类型
foo
。您返回的对象的实际类型对NRVO是否发生没有影响。这是一个好问题,但工作示例提出了许多其他问题。当然,答案是“不,不行”。简单地复制成员变量不会有好的结果。返回常量引用会使调用者承担进行深度复制选择的适当负担。还有一个限制,在这种情况下不适用:local不能是函数的参数。@juanchopanza在这种情况下?你是说
这个
参数吗?不,我是说在这个例子中,在OP的情况下。“不是C++ <代码>这个< /COD> .@ JuangopANZA是的,但是在这种情况下,只有<代码>这个< /Cux>参数:-)这就是为什么在这种情况下不适用的情况:-我用他们称之为代码>自我<代码>…