为什么将 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);
。
大家好,我还在学习 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);
。