为什么将 class 对象作为参数的外部函数在 returns 同一个对象时调用移动构造函数

why does an external function that takes a class object as a parameter calls a move constructor when it returns the same object

大家好,我还在学习 C++,但我对移动构造函数和复制构造函数有点困惑。

首先我有一个为对象设置值的简单函数

#include <iostream>
#include "item.hpp"
#include "player.hpp"

player giveHealth(player user, int value) {
    user.set_health(value);
    return user;
}

int main() {
    player a;
    player b(a);
    
    a = giveHealth(a, 100);
    
    return 0;
}

如您所见,我没有在 return 类型上添加 && 但它仍然调用 givehealth() 函数末尾的移动构造函数?

as you see i didnt add && on the return type

&& 会使 return 类型成为引用。如果你要 return 一个参考,那么就不会有移动。但是你会 returning 对局部变量的引用,该变量将在函数结束时被销毁,因此 returned 引用将始终悬而未决。不要那样做。

虽然 return user; 中的 user 是一个左值,因此您可能希望有一个副本,但这是一种特殊情况,因为 user 是一个局部变量,而是使用移动构造函数。这个语言规则是可能的,因为局部变量即将被销毁,因此可以安全地移动。

请参阅“从局部变量和参数自动移动”下的 cppreference

编译器会这样做。

If expression ... variable ... is declared as a parameter of the innermost enclosing function...
then overload resolution to select the constructor to use for initialization of the returned value ... is performed twice:
first as if expression were an rvalue expression (thus it may select the move constructor),

通俗地说,return variable; 会自动变成 return std::move(variable);