std::unique_ptr
考虑以下代码片段:
unique_ptr<int> foo() { unique_ptr<int> p(new int(10)); return p; // Line 1 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; }
第 1 行返回一个不带 std::move() 的 unique_ptr。令人惊讶的是,代码按预期编译和运行,那么在不调用复制构造函数的情况下,这怎么可能呢?
理解这种行为的关键在于 C 语言规范。具体来说,第 12.8 节 §34 和 §35 描述了复制省略:
当满足某些条件时,允许实现省略类对象的复制/移动构造 [...]。
在这种情况下,复制省略是允许的,因为:
当满足复制操作的省略条件并且要复制的对象由首先执行左值,为副本选择构造函数的重载决策,就像该对象是由右值指定的一样。
这意味着虽然返回值是一个命名对象(左值),重载决议仍将其视为右值。因此,不会调用 move 构造函数,并且成功构造了返回的 unique_ptr。
无需 std::move() 返回 unique_ptr 的能力是 C 语言的一个微妙功能语言规范。从函数返回 unique_ptr 时,不必显式使用 std::move(),只要满足复制省略的条件即可。这有助于提高代码清晰度并减少不必要的移动操作。
以上是为什么返回`std::unique_ptr`不需要`std::move()`?的详细内容。更多信息请关注PHP中文网其他相关文章!