Per esempio:Si può distinguere un weak_ptr scaduto da uno non inizializzato?
std::weak_ptr<int> wp1(std::make_shared<int>());
std::weak_ptr<int> wp2;
assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));
È una tale funzione possibile?
Caso di utilizzo: il costruttore di una classe accetta std::weak_ptr<Foo>
come dipendenza. Passare un oggetto scaduto è ok (potrebbe accadere in alcuni flussi di lavoro), ma il passaggio di null significa che il programmatore dimentica qualcosa. Mi piacerebbe testare questo come parte della validazione dei parametri del costruttore.
Hai dato un'occhiata al metodo ['expired()'] (http://en.cppreference.com/w/cpp/memory/weak_ptr/expired)? – Borgleader
@Borgleader. Sì - sfortunatamente, restituisce true per entrambi i casi. – dlf
Anche se sembra che ci sia una risposta, una soluzione meno magica potrebbe essere quella di avvolgere il puntatore debole in un tipo che può essere costruito solo con un puntatore condiviso non vuoto e che richiede invece un puntatore debole non elaborato. –