1

Я только что прочиталЛовушки "making" unique_ptr <T> неявно конвертируемые в T *?

Add implicit conversion from unique_ptr<T> to T*

, которая фокусируется на части, как-к-сделай, а не должен-I-Do-It. Я также не спрашиваю, думаете ли вы, что это хорошая идея, но я прошу конкретных ошибок, с которыми я мог бы столкнуться, или, если бы я подкласса 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 (их);.

void functionWithMemory(X * px) 
{ 
    static X* oldX = nullptr; 
    if(oldX) 
    { 
     oldX->goodbye(); 
    } 
    px->hello(); 
    oldX = px; 
} 

все еще надуман, но если вы продолжаете его расширять, он становится правдоподобным.

+0

Ну, я не знаю ... присвоение 'unique_ptr' всему остальному само по себе является красным флагом для возможных утечек и нарушений сегментации. На самом деле можно утверждать, что это выделяется _more_, чем наличие 'px = ux.get()'. – einpoklum

+1

@einpoklum: Можно утверждать, что, конечно. Это не делает вас правильным *. –

+0

@einpoklum Yep. вот почему я сказал: «Это очевидно». (хотя рассматривается отдельно, выражение '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