Peut-on distinguer un RTP faible expiré d'un RTP non initialisé?

Par exemple:

std::weak_ptr<int> wp1(std::make_shared<int>());
std::weak_ptr<int> wp2;

assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));

Est une fonction possible?

cas D'utilisation: le constructeur d'une classe prend std::weak_ptr<Foo> comme une dépendance. Passer un objet expiré est ok (peut se produire dans certains workflows), mais passer null signifie que le programmeur oublie quelque chose. J'aimerais tester ceci dans le cadre de la validation des paramètres du constructeur.

14
demandé sur dlf 2014-11-13 19:32:26
la source

1 ответов

std::weak_ptr::owner_before permet de distinguer entre les pointeurs faibles qui sont vides et expirés. Vous pouvez donc implémenter PointsToValidOrExpiredObject comme:

template <typename T>
bool PointsToValidOrExpiredObject(const std::weak_ptr<T>& w) {
    return w.owner_before(std::weak_ptr<T>{}) ||
           std::weak_ptr<T>{}.owner_before(w);
}

Démo.

en ce qui concerne l'incertitude initiale que j'avais à propos d'une période expirée weak_ptr maintaining ownership: je suis maintenant certain que les exigences générales de sécurité des thread-wide de la bibliothèque exigent qu'un weak_ptr continue à avoir la même propriété. Sinon, détruire le dernier qui reste shared_ptr dans le thread A d'observable modifier l'état d'un/certains/tous weak_ptr s qui partagent la propriété avec le shared_ptr en question. Si thread B examinait simultanément l'état d'un tel weak_ptr alors vous auriez une course de données introduite par l'implémentation de la bibliothèque qui est interdite en général.

16
répondu Casey 2017-05-23 14:59:31
la source

Autres questions sur c++ c++11 weak-ptr