在没有 std::move 的情况下返回 std::unique_ptr:怎么可能?
尽管 std:: 中禁止复制构造unique_ptr
例外:复制省略
C 允许在特定情况下进行复制省略,如中定义12.8 第 34 条和第 35 条。其中一种情况是返回与函数返回类型具有相同 cv 未限定类型的非易失性自动对象。在这种情况下,编译器可以省略复制构造过程。这种省略适用于复制和移动。
复制省略的实现
当在 return 语句中使用复制省略时,编译器首先将对象视为一个右值,即使它是一个左值,用于重载解析的目的。因此,如果移动构造函数可用,则会选择它,但不执行实际的移动操作。这会导致空的移动构造函数调用,充当占位符并维护唯一指针的所有权语义。
示例
以下代码演示了这种现象:
unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // Line 1, copy elision applied } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; }
第 1 行,返回的 unique_ptr
结论
C 语言规范特别允许复制构造函数禁止的这种例外,以促进高效和简洁的返回语句。但是,请务必注意,复制省略是编译器可能执行也可能不执行的优化。因此,通常建议在 return 语句中显式使用 std::move 以确保预期的行为。
以上是如何在不使用'std::move”的情况下返回'std::unique_ptr”?的详细内容。更多信息请关注PHP中文网其他相关文章!