Я работаю в очень большой кодовой базе 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
}