La fonction n'est pas propriétaire du bool, donc pas de unique_ptr ou shared_ptr. De plus ce paramètre est optionnel, donc pas de référence non plus (ou reference_wrapper). L'utilisation de weak_ptr serait abusif (compteur atomique, besoin de lock), surtout que le bool n'est pas obligatoirement managé par un shared_ptr (ca sera souvent une variable locale).
En termes de sémantique, ça serait une référence optionnelle. Du coup, ca peut être un std::optionnal<std::reference_wrapper<bool>>. Mais c'est un peu lourd...
Le pointeur nul est probablement le mieux ici. Cela correspond a un usage accepté (plus ou moins...) : celui de weak pointeur sans compteur de référence (l’équivalent de weak_ptr mais sans shared_ptr). Mais il faut respecter 2 contraintes :
- considérer qu'un pointeur nu ne transmet pas l'ownership (donc interdit de faire un delete sur un pointeur nu que l'on reçoit. Sauf si c'est explicitement indique que l'on transmet l'ownership, par exemple avec owner<T>)
- éviter de jouer au con... on s'amuse pas par exemple a appeler cette fonction dans un thread. Ou sur un pointeur qui peut être invalide (dangling).
Ce type de fonction ne doit être appelée que sur un bool local, pour éviter les problèmes d'ownership ou de lifetime.
Une autre solution est une surcharge :
1 2
| int str2int(std::string str, bool & ok)
int str2int(std::string str) |
C'est plus lourd a implémenter (bien que la seconde fonction peut appeler la première), mais comme le bool n'est plus optionnel, on peut utiliser une référence. C'est probablement le plus safe.
Partager