
"Jaap Suter" <boost@jaapsuter.com> wrote in message news:003501c58833$f508a020$4119059a@unknown...
Hi,
a weak_ptr can be said to have three states.
1. Never been assigned to (default constructed) 2. Assigned to, lock will return a shared_ptr to a valid object. 3. Assigned to, but the object pointed to is dead and lock will return null.
As far as I know it is currently impossible to distinguish between case 1 and 3. Am I overlooking something? If not, can somebody explain the reason why it is not possible to distinguish the two cases? Admittedly, I cannot come up with any elegant design in which such a distinction is useful, so the question is merely theoretical.
Actually, it is possible to distinguish case 1 from case 3: weak_ptr<Foo> wp = get_weak_ptr(); if (wp.expired()) { weak_ptr emptyPtr; // Default constructed weak_ptr if (!(emptyPtr < wp) && !(wp < emptyPtr)) { cout << "Case 1" << endl } else { cout << "Case 3" << endl; } } else { // Not expired cout << "Case 2" << endl; } } It is vital that a weak_ptr that is put into a set and later expires does not change its ordering relative to the other elements of the set. Joe Gottman