Я думал, что, хотя я понимаю цели std::observer_ptr, я думаю, что это было бы хорошо, если бы была хотя бы опция для аналогичного типа указателя, который знает, было ли удалено то, на что он указывает. Например, у нас может быть что-то вроде следующего
slightly_smart_ptr<Foo> p1(new Foo());
auto p2 = p1;
p1.erase(); // This deletes the foo referred to by p1.
if (p2.expired())
std::cout << "p2 is expired\n"; // this will fire
Один из способов добиться этого с помощью текущей стандартной библиотеки — создать shared_ptr для A в некоторой области, которая будет существовать в течение всего времени существования A, всегда ссылайтесь на A, передавая weak_ptr, и удаляйте A, когда он больше не нужен, путем сброса shared_ptr. Слабые_ptrs здесь будут иметь базовую семантику наблюдателя_ptrs, которые знают, был ли A удален. Но есть проблемы с этим подходом: weak_ptr должны быть заблокированы, превращая их в shared_ptrs для использования, что кажется неаккуратным, но, что более серьезно, shared_ptr для A должен где-то существовать, когда все, что пользователь хочет, это слегка умный указатель, который не владеет любой контент. Пользователь соглашается вручную уничтожить контент, когда придет время: никакие права собственности не являются общими, поэтому для пользователя является запахом кода, чтобы создать shared_ptr в такой ситуации.
Однако я не могу придумать, как можно было бы эффективно скрыть детали этой реализации.
Также существует ли такой указатель как предложение или в библиотеке повышения или где-либо еще?
shared_ptr
иweak_ptr
. Независимо от того, как вы это спроектируете, вам нужно как-то заблокировать объект, чтобы один указатель не удалял его, пока другой использует его. - person super   schedule 16.08.2019if(ptr.valid()) { stuff(); ptr->a; }
Функцияstuff()
может сделать указатель недействительным, поэтому вам придется проверять перед каждым утверждением - person Guillaume Racicot   schedule 16.08.2019