c++ - 为什么我们应该使用带有唯一指针的 std::move 语义?

标签 c++ c++11 c++14 smart-pointers unique-ptr

概念性问题

假设我们有这样一个简单的例子:

 void foo(std::unique_ptr<int> ptr)
 {
    std::cout << *ptr.get() << std::endl;
 }
 int main()
 {
    std::unique_ptr<int> uobj = std::make_unique<int>(4);
    foo(uobj );  // line-(1) Problem ,but Alternative -> foo(std::move(uobj ))
    std::unique_ptr<int> uobjAlt = uobj; // line-(2) Problem ,but Alternative -> std::unique_ptr<int> uobjAlt = std::move(uobj);        
    return EXIT_SUCCESS;
}

我们简单地知道 std::unique_ptr 与单个所有者拥有资源的概念绑定(bind),并在多个所有者之间移动资源,而 shared_ptr 具有相反的方面。 如上所示,当您查看 line-(1)line-(2) 时,您会注意到一些标准规则被违反了,因为 std::unique_ptr 有(已删除) 没有定义复制构造函数和复制赋值运算符,但为了避免编译错误,我们必须改用 std::move 函数。

问题

为什么现代 C++ 编译器不能自动生成指令以在 line-(1)line-(2) 中的唯一指针之间移动资源?因为我们知道独特的指针是有意设计的。为什么我们应该显式地使用 std::move 来指示机器移动资源的所有权?

std::unique_ptr 只不过是类模板。我们知道,但是在第 1 行和第 -2 行中解决的情况有问题,而编译器提示不允许复制 unique_pointers(已删除的函数)。为什么我们有这些错误,为什么 C++ 标准和编译器供应商不能覆盖这个概念?

Unique Pointer 有意设计用于在传递其所有权的同时移动资源,当我们将其作为函数/构造函数参数传递或分配给另一个唯一指针时,它在概念上应该移动具有所有权的资源,但为什么我们应该使用 std::move 将编译器传送到实际移动,为什么我们不能自由地调用 line-(1) 和 line-(2) 呢? (而智能编译器会为我们自动生成唯一指针之间的移动操作,除非有const 或non-const 引用 传递)。

(抱歉,描述太长,英文也不好)谢谢。

最佳答案

unique_ptr 有助于在 uobj 超出范围时自动为您释放内存。那是它的工作。因此,由于它有 1 个必须释放的指针,它必须是唯一的,因此它的名字是:unique_ptr!

当你做这样的事情时:

std::unique_ptr<int> uobjAlt = uobj;

您正在发出一个复制操作,但是,您不应该复制指针,因为复制意味着 uobjAltuobj 都必须释放,这将直接导致段错误和崩溃。因此,通过使用 std::move,您可以将所有权从一个对象转移到另一个对象。

如果你想有多个指针指向一个对象,你应该考虑使用std::shared_ptr .

关于c++ - 为什么我们应该使用带有唯一指针的 std::move 语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42038359/

相关文章:

c++ - 从随机单词中删除重复的字符

c++ - 将角度表示为 cos/sin 对

c++ - 如何在 SFML 中实现基于网格的移动?

C++ constexpr 实现差异

c++ - 类型到 int 的映射

c++ - 制作随机柏林噪声时如何避免模式

c++ - 为什么我们需要模板模板参数的模板特化

c++ - C++ 中的常量正确性语义

c++ - 为什么 noexcept 在标准库中没有更多使用?

c++ - integral_constant 的编译时 bool 运算?