默认情况下,返回是否使用移动或复制语义

Does return use move or copy semantics by default?

本文关键字:移动 复制 语义 情况下 返回 是否 默认      更新时间:2023-10-16

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

鉴于:

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

在 C++17 中,移动是否优先于副本?如果是这样,相同的规则是否适用于显式定义移动构造函数的用户定义类型?

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

取决于。

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

确切的规则有点复杂,但一般来说,如果可以移动,那么它比复制更可取。

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

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

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

当然,当类型像int一样微不足道地可移动/可复制时,没有可观察到的区别。即使有副本,也可以对其进行优化。复制和移动整数之间没有区别。