0

我看过其他关于std::move的帖子,但这些例子对我来说有点复杂,所以我将尝试用一个非常简单的例子来解释我的问题。

void increaseNum(整数num){num+=1;}整型main(){整数myNum{5};increaseNum(myNum);//案例-1increaseNum(std::move(myNum))//案例2}

案例-1它不会更改的值myNum(我的编号)因为我是按价值传递的。它在内部创建myNum的副本增加数字并在此处更改副本的值。然而,在第2种情况我所期望的是,我正在对增加数字“嘿,不要创建myNum的副本,而是获取该变量的所有权并进行更改,就像通过引用一样”。当我打印出来时myNum(我的编号)之后第2种情况,还是5分让我困惑。

有人能帮我一下吗?就是给予std::move(变量)作为函数参数与按引用传递不同?如果不是,我们为什么要给予std::move(变量)作为函数参数?

14
  • 2
    "我想我是在说增加Num“嘿,不要创建myNum的副本,而是获取该变量的所有权并进行更改,就像通过引用一样”。", "将std::move(variable)作为函数参数与通过引用传递不同吗?“:两者都错了。这不是什么标准::移动做。"如果不是,为什么我们要将std::move(variable)作为函数参数?“:对于非类类型,这是毫无意义的。只有当被调用的函数具有rvalue引用重载时,或者对于pass-by-value,如果类型具有move构造函数,这才重要。 评论 2023年4月9日13:01
  • 1
    这回答了你的问题吗?为什么std::move()没有窃取int值?,stackoverflow.com/questions/3413470/…. 评论 2023年4月9日13:03
  • 4
    你的期望是错误的。移动语义不是“通过引用传递”。 评论 2023年4月9日13:04
  • 传递值取决于int数字函数签名中的参数声明。While期间标准::移动对于内置类型和其他普通的可复制类型来说,这几乎毫无意义,因为它是一种选择r值引用重载的工具,而这些类型通常不存在r值引用过载。 评论 2023年4月9日13:07
  • 2
    改变你的思维模式标准::移动这样:一旦对象标准::移动,它处于只适合销毁或重新分配的状态。所以不要看myNum(我的编号)在你移动它之后,因为它被污染了。(在这种情况下整数但如果你将“移动的对象现在已被污染”内化,你会过得更好。) 评论 2023年4月9日13:11

0

重置为默认值