假设我有一个看起来像这样的函数:
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
toobj
?
编号复制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;