1

我刚刚看了可以隐式转换为T *的“制造”unique_ptr <T>的陷阱?

Add implicit conversion from unique_ptr<T> to T*

其重点是如何到做它的一部分,而不是应该-I-DO-它。我也不是问你是否认为这是一个好主意,但是我要求具体的陷阱,我可能弄错了,或者如果我继承unique_ptr以将隐式转换的功能添加到原始指针(所以我可以只需将它直接传递给指针函数,而不使用get())。

+1

没有太多的区别和'得到()'适用于后者的所有缺陷也将适用于隐式转换。 –

+0

@πάνταῥεῖ:但是另一个方向呢?也许像STL数据结构中意外的模板实例化选择一样?我不知道,有些恶心。 – einpoklum

回答

3

考虑这个略显做作情况:

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; 
} 

仍然有人设想,但如果你继续扩展它,它开始变得合理。

+0

嗯,我不知道......将unique_ptr分配给其他任何东西本身就是潜在的泄漏和分段违规的红旗。事实上,有人可能会认为这比'px = ux.get()'更具有突出性。 – einpoklum

+1

@einpoklum:当然可以争辩。这不会让你*正确*。 –

+0

@einpoklum是的。这就是为什么我说“这很明显”。 (尽管孤立地考虑了'px = ux'这个语句不会引发标志,在开始担心之前你必须回头检查'ux'的类型。) –

3

的隐式转换将允许各种废话:

{ 
    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 
+0

除了'bool'赋值,这些看起来都是合法和合理的,但即使是这样,这也是很荒谬的一个正常的指针。 – einpoklum

+1

@einpoklum你认为允许单个对象的'unique_ptr'上的指针运算和下标是完全合法的吗? –

+0

是的 - 就像使用普通指针一样。你只知道它是一个单一的对象,因为你知道unique_ptr是如何初始化的。 – einpoklum

相关问题