微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么将类对象作为参数的外部函数在返回相同对象时调用移动构造函数

如何解决为什么将类对象作为参数的外部函数在返回相同对象时调用移动构造函数

嘿伙计们仍在学习 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;
}

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

解决方法

如你所见,我没有在返回类型上添加&&

&& 将使返回类型成为引用。如果您要返回引用,则不会有任何移动。但是您将返回对局部变量的引用,该引用将在函数结束时被销毁,因此返回的引用将始终处于危险状态。不要那样做。

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

,

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

编译器会这样做。

如果表达式 ... 变量 ... 被声明 作为参数 最内层的封闭函数...
然后重载决议选择用于初始化返回值的构造函数......执行两次:
首先好像表达式是一个右值表达式(因此它可以选择移动构造函数),

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。