首页 >后端开发 >C++ >我可以在 C 中返回一个没有 `std::move` 的 `std::unique_ptr` 吗?

我可以在 C 中返回一个没有 `std::move` 的 `std::unique_ptr` 吗?

Susan Sarandon
Susan Sarandon原创
2024-12-15 02:42:09465浏览

Can I Return a `std::unique_ptr` Without `std::move` in C  ?

在没有 std::move 的情况下返回 std::unique_ptr

在 C 中,std::unique_ptr 强制执行移动语义以防止对象的多重所有权。但是,可以从函数返回 unique_ptr,而不调用 std::move。此行为可归因于称为复制省略的语言功能。

复制省略

根据 C 语言规范(12.8 §34 和 §35),允许实现省略(省略) 满足某些条件时的复制/移动操作。具体来说,在类返回类型的 return 语句中允许复制省略,前提是表达式是非易失性自动对象的名称,该对象的 cv 未限定类型与函数返回类型相同。

省略在 unique_ptr 返回语句

您提供的示例代码中:

unique_ptr<int> foo()
{
  unique_ptr<int> p(new int(10));
  return p;  // Line 1
}

p 是一个非易失性自动对象,与函数返回类型具有相同的类型 unique_ptr。因此,编译器可以省略 p 的复制构造。

当编译器遇到第 1 行时,它首先执行重载解析来选择复制操作的构造函数,就好像 p 是由右值指定的一样。然而,由于满足了省略的标准,复制构造被省略,返回的值成为移出的 unique_ptr。

对最佳实践的影响

需要注意的是按值返回在这种情况下应该是默认选择。在存在复制省略的情况下,return 语句中的命名值将被视为右值。这意味着即使没有显式使用 std::move,返回的 unique_ptr 也可以从函数的临时对象中移动。

通过引用返回或使用 std::make_unique 都是避免复制省略并确保显式的可行替代方案所有权转让。

以上是我可以在 C 中返回一个没有 `std::move` 的 `std::unique_ptr` 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn