为什么 `unique_ptr<QByteArray>` 没有降级为 `QByteArray*`?

Why doesn't `unique_ptr<QByteArray>` degrade to `QByteArray*`?

我有以下代码:

  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(),但这似乎是不必要的。

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

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