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

前端之家收集整理的这篇文章主要介绍了c – 可以复制elision / RVO导致同一对象的复制/移动前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个看起来像这样的函数
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;

猜你在找的C&C++相关文章