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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top