Шаблон “интеллектуального указателя” C++, который автопреобразовывает в пустой указатель, но не может быть явно удален

Я работаю в очень большой кодовой базе C++ прежней версии, которая должна остаться неназванной. Будучи основой унаследованного кода, это раздает необработанные указатели повсеместно. Но мы постепенно пытаемся модернизировать его и таким образом, существуют некоторые шаблоны интеллектуального указателя также. Эти интеллектуальные указатели (в отличие от, скажем, scoped_ptr Повышения) имеют неявное преобразование в необработанный указатель, так, чтобы можно было передать одного из них в стандартную программу, которая берет необработанный указатель, не имея необходимость писать .get(). Большая оборотная сторона этого - то, что можно также случайно использовать один в a delete оператор, и затем у Вас есть двойная бесплатная ошибка, которая может быть реальной болью для разыскивания.

Существует ли способ изменить шаблон так, чтобы он все еще имел неявное преобразование в необработанный указатель, но вызвал ошибку компиляции, если используется в операторе удаления? Как это:

#include <my_scoped_ptr>

struct A {};
extern void f(A*);

struct B
{
    scoped_ptr<A> a;

    B();
    ~B();
};

B::B()
    : a(new A)
{
    f(a); // this should compile
}

B::~B()
{
    delete a; // this should NOT compile
}
5
задан zwol 22 July 2010 в 18:21
поделиться