以下代码是否安全?
struct Foo {
Foo bar() { return *this; }
} foo;
foo = std::move(foo).bar(); // is this safe?
我想知道在右值上调用方法是否安全。
答案 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