【发布时间】: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_ptr 和shared_ptr 在作为参数传递给采用指针的函数时会自动降级为原始指针。如果不是,为什么不呢?如果他们(通常)这样做,为什么在 QByteArray 的情况下会失败?
我可以显式调用msg_buf_ptr.get(),但这似乎是不必要的。
【问题讨论】:
-
他们为什么要转换成
T *?大多数隐式转换最终带来的麻烦多于其价值。 -
这就是重点。这是
unique_ptr。独特。如果当你将它传递到某个地方时它被隐式转换为指针,它将失去唯一的全部目的,因为函数可以将它存储在内部或做其他事情和 BAM,它不再是唯一的。shared_ptr也是如此。重点是让get()获得的底层指针存在很短的时间,而不是将它们传递给任何地方或类似的东西。 -
我假设明确使用
get()会迫使您知道自己在做什么。例如,这意味着您有意识地获得了一个指向unique_ptr拥有的内存的裸指针。 -
无论如何,重要的隐式转换都是不好的,在任何设计中都应该避免。
-
这就是重点。您不能制作通用智能指针并将它们隐式转换回原始指针,因为现有代码库中有不同的指针所有权模型。它强制您显式地
get()原始指针,以便您花一点时间考虑传递原始指针的后果。如果你将它传递给第三方代码,假设它拥有所有权怎么办?或者其他一些假设会破坏你的程序在运行时崩溃而没有一个编译时警告。
标签: c++ qt c++11 unique-ptr qbytearray