23Fermer25
BrunniLe 23/05/2013 à 07:48
gon33 (./21) :
L'inconvénient de ce genre de pratique en c++, c'est que si as un bout de code externe (genre une lib) qui n'utilise que des pointeurs normaux, ça te bousille toute la jolie sémantique...

Oui, c'est d'ailleurs le souci de ma solution. On ne peut pas passer des objets "normaux" à des fonctions attendant des références partagées, typiquement :
void fonction(ref<int> valeur) {
    printf("Valeur: %d", valeur);
}

void main() {
    int *ptrInt = new int(1);
    fonction(ptrInt);
    delete ptrInt;
}

Ca va planter car la référence créée automatiquement pour la fonction va prendre possession de l'objet, et l'effacera au retour de la fonction (ce qui est rarement ce qu'on veut, à moins d'avoir passé un new qqch comme paramètre). C'est pourquoi dans mon implém réelle les références créées automatiquement ne gèrent pas l'objet qui leur est assigné en réalité. Il faut déclarer explicitement que l'objet appartient à la référence.
void fonction(ref<int> valeur) {
    printf("Valeur: %d", valeur);
}

void main() {
    int *unmanagedPtr = new int(1);
    ref<int> managedPtr = make_ref(new int(1));
    fonction(unmanagedPtr);
    fonction(managedPtr);
    delete unmanagedPtr;
}