Estoy trabajando en una base de código C++ heredada muy grande que permanecerá sin nombre. Al ser una base de código heredado, pasa punteros sin procesar por todas partes. Pero estamos tratando de modernizarlo gradualmente, por lo que también hay algunas plantillas de punteros inteligentes. Estos punteros inteligentes (a diferencia, por ejemplo, Boost's scoped_ptr) tienen una conversión implícita al puntero sin formato, por lo que puede pasar uno de ellos a una rutina que toma un puntero sin formato sin tener que escribir .get()
. Un gran inconveniente de esto es que también puedes usar accidentalmente uno en una declaración delete
, y luego tienes un error libre doble, que puede ser un verdadero problema para localizar.Plantilla de "puntero inteligente" de C++ que se convierte automáticamente en puntero descubierto pero no se puede eliminar explícitamente
¿Hay alguna manera de modificar la plantilla para que todavía tenga la conversión implícita al puntero sin formato, pero provoca un error de compilación si se utiliza en una instrucción de eliminación? De esta manera:
#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
}
Haría eso, ¿verdad? – GManNickG
g ++ está indeciso, 4.4 no compila, 4.5 lo hace. Si cambio el tipo de la segunda conversión a un tipo de puntero a función, entonces g ++ lo hace bien y se detiene en 'eliminar a'. –
@Luther gracias, agregué :) –