在编程领域,在函数返回值上使用 std::move 会提示问题何时需要采取这样的行动。考虑以下代码片段:
struct Foo {}; Foo meh() { return std::move(Foo()); }
在这种情况下,移动似乎是多余的,因为新创建的 Foo 由于其临时性质已经是 xvalue。然而,在下面这样的场景中,std::move 起着至关重要的作用:
struct Foo {}; Foo meh() { Foo foo; // Perform operations, ensuring safe disposal of foo return std::move(foo); }
这里,foo 被创建为左值,如果没有 std::move,编译器可能无法识别它之后可以安全地移除。移动操作明确请求移动而不是复制对象,以确保正确的资源管理。
要掌握的一个关键概念是“假设” “C 标准 (12.8/32) 中概述的规则。此规则要求,当满足省略复制操作的特定条件时,编译器的行为必须就像该对象是由右值指定的一样,即使它是左值。在给定的示例中,NRVO(命名返回值优化)允许删除从 foo 到返回值的复制。因此,移动构造函数会在没有显式 std::move 的情况下自动调用。
总之,std::move 应该在返回值上使用当满足以下条件时:
为了简化非模板代码中的决策过程,请考虑这些规则:
通过遵守这些简化的规则,开发人员牺牲了一些移动省略,但获得了易用性的优势。但是,对于复杂的模板或具有昂贵移动操作的类型,建议进行细致的分析以确保最佳的代码性能。
以上是什么时候应该在函数的返回值上使用'std::move”?的详细内容。更多信息请关注PHP中文网其他相关文章!