shared_ptr const a shared_ptr
-
19-09-2019 - |
Pregunta
¿Cómo se puede convertir un shared_ptr que apunta a un objeto constante a un shared_ptr que apunta a un objeto no const. Estoy tratando de hacer lo siguiente:
boost::shared_ptr<const A> Ckk(new A(4));
boost::shared_ptr<A> kk=const_cast< boost::shared_ptr<A> > Ckk;
Pero no funciona.
Solución
'boost :: const_pointer_cast' va a hacer lo que estás pidiendo, pero la segunda mitad obligatorio de la respuesta es que es probable que no se debe utilizar. 99% de las veces cuando parece que necesita desechar la propiedad const de una variable, que significa que tiene un defecto de diseño. Const es a veces más que un escaparate y echando a la basura puede dar lugar a errores inesperados.
Sin conocer más detalles de su situación no se puede decir con certeza. Pero no hay discusión const-cast es completa sin mencionar este hecho.
Otros consejos
El uso boost::const_pointer_cast
, documentación.
la forma correcta debe ser esto
boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));
std::const_cast_pointer
hace un segundo puntero administrado. Después de que el molde tiene un puntero puede escribir y el original const-puntero. El pointee sigue siendo el mismo. El recuento de referencia se ha incrementado en 1.
Tenga en cuenta que const_cast
es una palabra clave incorporada, pero const_pointer_cast
es una función de plantilla en std
espacio de nombres.
El puntero de escritura a continuación, se puede utilizar para cambiar el valor de debajo de la shared_ptr<const T>
. En mi humilde opinión el puntero se puede escribir sólo debe persistir temporalmente en la pila; de lo contrario tiene que haber un defecto de diseño.
Una vez escribí un programa de prueba pequeña para dejar esto claro a mí mismo, que me he adaptado a este tema:
#include <memory>
#include <iostream>
#include <cassert>
using namespace std;
typedef shared_ptr<int> int_ptr;
typedef shared_ptr<const int> const_int_ptr;
int main(void)
{
const_int_ptr Ckk(new int(1));
assert(Ckk.use_count() == 1);
cout << "Ckk = " << *Ckk << endl;
int_ptr kk = const_pointer_cast<int>(Ckk); // obtain a 2nd reference
*kk = 2; // change value under the const pointer
assert(Ckk.use_count() == 2);
cout << "Ckk = " << *Ckk << endl; // prints 3
}
En UNIX o Windows / Cygwin, compilar con
g++ -std=c++0x -lm const_pointer_cast.cpp