【问题标题】:Why doesn't `unique_ptr<QByteArray>` degrade to `QByteArray*`?为什么 `unique_ptr<QByteArray>` 不会降级为 `QByteArray*`?
【发布时间】:2015-05-11 04:58:47
【问题描述】:

我有以下代码:

  msg_buf_ptr = std::make_unique<QByteArray>();

  return QDataStream{msg_buf_ptr, QIODevice::WriteOnly};

我收到以下错误:

no known conversion for argument 1 from ‘std::unique_ptr<QByteArray>’ to ‘QByteArray*’

但是……为什么?我认为unique_ptrshared_ptr 在作为参数传递给采用指针的函数时会自动降级为原始指针。如果不是,为什么不呢?如果他们(通常)这样做,为什么在 QByteArray 的情况下会失败?

我可以显式调用msg_buf_ptr.get(),但这似乎是不必要的。

【问题讨论】:

  • 他们为什么要转换成T *?大多数隐式转换最终带来的麻烦多于其价值。
  • 这就是重点。这是unique_ptr。独特。如果当你将它传递到某个地方时它被隐式转换为指针,它将失去唯一的全部目的,因为函数可以将它存储在内部或做其他事情和 BAM,它不再是唯一的。 shared_ptr 也是如此。重点是让get() 获得的底层指针存在很短的时间,而不是将它们传递给任何地方或类似的东西。
  • 我假设明确使用get() 会迫使您知道自己在做什么。例如,这意味着您有意识地获得了一个指向 unique_ptr 拥有的内存的裸指针。
  • 无论如何,重要的隐式转换都是不好的,在任何设计中都应该避免。
  • 这就是重点。您不能制作通用智能指针并将它们隐式转换回原始指针,因为现有代码库中有不同的指针所有权模型。它强制您显式地get() 原始指针,以便您花一点时间考虑传递原始指针的后果。如果你将它传递给第三方代码,假设它拥有所有权怎么办?或者其他一些假设会破坏你的程序在运行时崩溃而没有一个编译时警告。

标签: c++ qt c++11 unique-ptr qbytearray


【解决方案1】:

不,这不是特例;标准库智能指针在需要原始指针的上下文中不会隐式降级。

如问题中所述,从unique_ptr 访问底层原始指针的正确方法是使用get()。这是一个设计功能,显然是为了帮助避免意外导致多所有权场景,这会导致未定义的行为。

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 2019-02-08
    • 2016-11-04
    • 2020-09-18
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    相关资源
    最近更新 更多