移动变量并对其进行操作

时间:2016-05-08 01:41:07

标签: c++ c++11

以下代码是否安全?

struct Foo {
   Foo bar() { return *this; }
} foo;

foo = std::move(foo).bar();  // is this safe?

我想知道在右值上调用方法是否安全。

2 个答案:

答案 0 :(得分:2)

通常,在右值上调用函数比在左值上调用函数更安全或更不安全。

至于您的特定代码,实际上没有任何移动。 std::move(foo)会将其转换为右值,这与对Foo::bar的调用无关,因为它并不关心this是左值还是左值。 bar将返回foo副本,然后将其复制回foo

如果您根本没有使用过std::move,那就会发生同样的事情。 std::move实际上并没有移动任何东西;它只是将其转换为可以参与移动操作的右值。

您的真正的问题是:对于任何可移动的T类型,这是合法的:

T t;

t = T(std::move(t));

答案是......也许吧。移动对象的状态正是T的作者选择它的状态。对于大多数标准库类型,它将是"有效但未指定"。这意味着您可以使用不需要先决条件的函数,这些函数无论当前状态如何都可以。

移动赋值通常是这样一个函数,因此通常会起作用。它适用于所有类型吗?没有什么可以保证它会。这取决于如何为每种类型实施移动支持。一些用户定义的类型甚至无法实现有效但未指定的类型#34; state,这意味着你唯一允许对移动对象做的就是销毁它。

这一切都取决于用户选择如何工作。但是,我会说t = T(std::move(t))不起作用的类型(即产生未定义的行为)将是一种非常不良的类型。

答案 1 :(得分:-3)

不是非常安全,有时很难分解,如果只是为了一个简单的程序/游戏它应该没问题,我建议你为一个大程序使用更安全的代码:)

总的来说,如果它破裂,它将不会坏。

我的意思是超级安全,如果你决定使用标准方法的功能(例如:像你一样使用结构),它就无法处理中断。

抱歉,我无法提供尽可能多的信息,我对结构很新 如果有人想编辑我的答案,他们可以。

谢谢,

〜Coolq