我刚刚看了可以隐式转换为T *的“制造”unique_ptr <T>的陷阱?
Add implicit conversion from unique_ptr<T> to T*
其重点是如何到做它的一部分,而不是应该-I-DO-它。我也不是问你是否认为这是一个好主意,但是我要求具体的陷阱,我可能弄错了,或者如果我继承unique_ptr
以将隐式转换的功能添加到原始指针(所以我可以只需将它直接传递给指针函数,而不使用get()
)。
我刚刚看了可以隐式转换为T *的“制造”unique_ptr <T>的陷阱?
Add implicit conversion from unique_ptr<T> to T*
其重点是如何到做它的一部分,而不是应该-I-DO-它。我也不是问你是否认为这是一个好主意,但是我要求具体的陷阱,我可能弄错了,或者如果我继承unique_ptr
以将隐式转换的功能添加到原始指针(所以我可以只需将它直接传递给指针函数,而不使用get()
)。
考虑这个略显做作情况:
X* px;
{
unique_ptr<X> ux = new X;
px = ux; // implicit conversion
}
px->method();
当提出这样很明显,调用PX->方法将失败(或没有,这将是更糟糕),但如果这个代码更复杂(比如采取X *作为参数的方法的调用,不明显的错误可以去未捕获
例如一起functionWithMemory调用(UX)取代PX = UX;
void functionWithMemory(X * px)
{
static X* oldX = nullptr;
if(oldX)
{
oldX->goodbye();
}
px->hello();
oldX = px;
}
仍然有人设想,但如果你继续扩展它,它开始变得合理。
嗯,我不知道......将unique_ptr分配给其他任何东西本身就是潜在的泄漏和分段违规的红旗。事实上,有人可能会认为这比'px = ux.get()'更具有突出性。 – einpoklum
@einpoklum:当然可以争辩。这不会让你*正确*。 –
@einpoklum是的。这就是为什么我说“这很明显”。 (尽管孤立地考虑了'px = ux'这个语句不会引发标志,在开始担心之前你必须回头检查'ux'的类型。) –
的隐式转换将允许各种废话:
{
unique_ptr<int> p(new int);
p + 10; // OK with implicit conversion
p[3]; // ditto
bool x = p; // ditto
unique_ptr<Derived> d(new Derived);
unique_ptr<Base> b(d); // OK with implicit conversion...oops
// These two unique_ptr's own the same object!
} // double deletion here
没有太多的区别和'得到()'适用于后者的所有缺陷也将适用于隐式转换。 –
@πάνταῥεῖ:但是另一个方向呢?也许像STL数据结构中意外的模板实例化选择一样?我不知道,有些恶心。 – einpoklum