Question

Comment peut-on convertir un shared_ptr qui pointe vers un objet const à un shared_ptr qui pointe vers un objet non-const. Je suis en train de faire ce qui suit:

boost::shared_ptr<const A> Ckk(new A(4));

boost::shared_ptr<A> kk=const_cast< boost::shared_ptr<A> > Ckk;

Mais cela ne fonctionne pas.

Était-ce utile?

La solution

« boost :: const_pointer_cast » fera ce que vous demandez, mais la seconde moitié obligatoire de la réponse est que vous ne devriez probablement pas l'utiliser. 99% du temps quand il semble que vous devez rejetterai la propriété const d'une variable, cela signifie que vous avez un défaut de conception. Const est parfois plus que la poudre aux yeux et peut le jeter loin conduire à des bugs inattendus.

Sans connaître plus de détails sur votre situation on ne peut pas dire avec certitude. Mais aucune discussion const-cast est complet sans mentionner ce fait.

Autres conseils

utilisation boost::const_pointer_cast, .

la bonne façon devrait être ce

boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));

std::const_cast_pointer fait un second pointeur managé. Après la distribution, vous avez un pointeur inscriptible et le pointeur const d'origine. Le reste de la même pointée. Le nombre de références a été augmenté de 1.

Notez que const_cast est un mot-clé builtin, mais const_pointer_cast est une fonction de modèle dans l'espace de noms std.

Le pointeur inscriptible peut alors être utilisé pour modifier la valeur sous le shared_ptr<const T>. À mon humble avis le pointeur inscriptible ne doit persister temporairement sur la pile; sinon il doit y avoir un défaut de conception.

J'ai écrit un petit programme de test pour que ce soit clair pour moi-même que je me suis adapté pour ce thread:

#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
}

Sous UNIX ou Windows / Cygwin, compiler avec

g++ -std=c++0x -lm const_pointer_cast.cpp
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top