默认情况下,return是否使用move或copy语义?

时间:2019-03-29 23:29:11

标签: c++ c++17

从C#迁移到C ++,试图了解幕后发生的事情。

给出:

int ReturnSomething(){
    int i = 1;
    return i;
}

在C ++ 17中,移动优先于复制吗?如果是这样,相同的规则是否适用于明确定义了移动构造函数的用户定义类型?

1 个答案:

答案 0 :(得分:5)

  

默认情况下返回使用移动或复制语义吗?

视情况而定。

  

在C ++ 17中,移动优先于复制吗?

确切的规则有些复杂,但通常,如果可以移动,则优先于复制。

在某些情况下,甚至没有移动。例如:

T ReturnSomething(){
    return 1;
}
T t = ReturnSomething();

不涉及复制。为t变量分配了一个对象,并且ReturnSomething直接初始化该对象。没有临时对象。

当然,当类型像int那样可移动/可复制时,没有明显的区别。即使有副本,也可以对其进行优化。复制和移动整数之间没有区别。