在 C 中,std::unique_ptr 强制执行移动语义以防止对象的多重所有权。但是,可以从函数返回 unique_ptr,而不调用 std::move。此行为可归因于称为复制省略的语言功能。
根据 C 语言规范(12.8 §34 和 §35),允许实现省略(省略) 满足某些条件时的复制/移动操作。具体来说,在类返回类型的 return 语句中允许复制省略,前提是表达式是非易失性自动对象的名称,该对象的 cv 未限定类型与函数返回类型相同。
您提供的示例代码中:
unique_ptr<int> foo() { unique_ptr<int> p(new int(10)); return p; // Line 1 }
p 是一个非易失性自动对象,与函数返回类型具有相同的类型 unique_ptr
当编译器遇到第 1 行时,它首先执行重载解析来选择复制操作的构造函数,就好像 p 是由右值指定的一样。然而,由于满足了省略的标准,复制构造被省略,返回的值成为移出的 unique_ptr。
需要注意的是按值返回在这种情况下应该是默认选择。在存在复制省略的情况下,return 语句中的命名值将被视为右值。这意味着即使没有显式使用 std::move,返回的 unique_ptr 也可以从函数的临时对象中移动。
通过引用返回或使用 std::make_unique 都是避免复制省略并确保显式的可行替代方案所有权转让。
以上是我可以在 C 中返回一个没有 `std::move` 的 `std::unique_ptr` 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!