加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 可以复制elision / RVO导致同一对象的复制/移动

发布时间:2020-12-16 03:43:20 所属栏目:百科 来源:网络整理
导读:假设我有一个看起来像这样的函数: SomeObject copy_maybe(bool make_new,const SomeObject def){ if (make_new) return SomeObject(); else return def;} 我称之为: SomeObject obj;obj = copy_maybe(true,obj); 如果没有copy elision,这显然会导致从copy_
假设我有一个看起来像这样的函数:
SomeObject copy_maybe(bool make_new,const SomeObject& def)
{
    if (make_new)
        return SomeObject();
    else
        return def;
}

我称之为:

SomeObject obj;
obj = copy_maybe(true,obj);

如果没有copy elision,这显然会导致从copy_maybe中创建的临时副本复制到obj.但是,使用copy elision / RVO,是否可能从obj到obj发生复制?

更具体地说,在这些(或类似的)条件下,是否可以在复制操作符(void operator =(SomeObject const& other))中,由于复制省略,这个和& other会相同吗?

我在Ideone上创建了一个test,它返回单独的地址,但我只是想确保这个行为是由规范定义的.

解决方法

However,with copy elision/RVO,is it possible that the copy will happen from obj to obj?

编号复制elison / RVO用于初始化变量的过程.因为你已经使用SomeObject obj初始化了obj;你不会得到任何优化.将调用复制赋值运算符,并且将从函数中为来自调用站点的obj分配obj的值.

如果你有

SomeObject obj = copy_maybe(true,obj);

然后是的,复制elison可以(将在C 17中)发挥作用.

请注意打电话

SomeObject obj = copy_maybe(false,obj);

将obj留在一个不确定的状态,因为它将是相同的

SomeObject obj = obj;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读