Viacheslav
Значит они решили, что наблюдение без владения лучше объяснить словом observe.
Viacheslav
Это не опциональный владелец. Это просто сторонний наблюдатель, который никак на владение объектом не влияет.
Constantine
потому что observer_ptr семантически выражает внешнее владение обернутым указателем, которое в силу логических доказательств приводит к постоянному существованию этого объекта
Viacheslav
Не знаю, откуда у Вас такое понимание слова observe. Ничего такого оно семантически не означает.
Viacheslav
Ну и где тут хоть что-то, что переводится как "владеть"?
Viacheslav
Constantine
Constantine
Существует ровно два случая, когда мы можем разыменовать указатель - (а) мы знаем, что мы сдохнем раньше и (б) нас оповестят
Max
Если вкратце, какой смысл weak_unique_ptr ?
Viacheslav
Constantine
Constantine
в случае (а) это обратная ссылка на владеющий объект, которая только по очень вселенской причине может быть не reference_wrapper
Viacheslav
Ну и что не так-то, я не пойму? Когда у тебя Blah* где-то в кишках, то никакой дополнительной информации это не несёт. observer_ptr<Blah> точно семантически показывает, что мы объектом не владеем.
Viacheslav
Constantine
Anonymous
Красивое название для обычных указателей.
Constantine
Я не понимаю, почему этот класс называется не "pointer_wrapper"
Viacheslav
Anonymous
Constantine
Anonymous
Ну и что не так-то, я не пойму? Когда у тебя Blah* где-то в кишках, то никакой дополнительной информации это не несёт. observer_ptr<Blah> точно семантически показывает, что мы объектом не владеем.
Viacheslav
Viacheslav
Он ничего не оборачивает.
Constantine
То же самое, только никогда не null? Методом using observer_ref = reference_wrapper?
Constantine
replacement for raw pointer types
Berkus
Constantine
Constantine
и речь идет об указателе, который НИКОГДА не будет разыменован?
Berkus
с первым соглашусь, со вторым не очень
Constantine
пойду писать пропоуз на pointer_wrapper
Berkus
удачи!
Constantine
хм....
Constantine
у него таки есть
operator*operator->
dereferences pointer to the watched object
Viacheslav
И что тебя смущает-то? Он ведёт себя как сырой указатель.
Berkus
ты прямо жирный тролль похоже, прямо очень жирный
Berkus
у меня пальцы к клавиатуре начинают прилипать
Constantine
Viacheslav
А зачем вообще нужен указатель, который нельзя разыменовать? Какой в нём тогда смысл, как доступ к данным получить-то?
Constantine
В одной ОС, которую нельзя называть, такие указатели называются HANDLE
Constantine
И используются чуть меньше, чем в каждой API
Viacheslav
HANDLE — это opaque type.
Viacheslav
То, что это указатель, тебя вообще волновать не должно.
Viacheslav
Это может быть число, как в Unix, или какая-нибудь структура.
Constantine
Только HANDLE имеет размер указателя <s>и крякает как void*</s>
Viacheslav
Если его только в API передавать, то крякает он как тип, о котором ты вообще ничего не знаешь. И точка.
Viacheslav
Это даже не void* для тебя должен быть.
Constantine
Constantine
Причем CopyConstructible как указатель
Constantine
Так что IncompleteType* в точности совпадает семантически
Constantine
Тем более, что нет ни одной причины ему не быть IncompleteType* и использовать лишний ремаппинг
Viacheslav
Когда не получится, расскажи про CopyConstructible для абстрактного ресурса.
Constantine
Constantine
И спрошу у вас, понимаете ли вы, что void* это копируемое значение
Stanislav
Viacheslav
А я, пожалуй, скажу, что у класса, содержащего handle, без доступа к дополнительному API нет и не может быть никакого copy constructor. Потому что ты понятия не имеешь, как копирование абстрактного ресурса себя поведёт. И как его освобождать.
Viacheslav
Потому что, внезапно, есть CloseHandle.
Constantine
Viacheslav
Потому что, внезапно, есть CloseHandle.
Так что разговор я считаю закрытым, Вы разницу между opaque object which owns something and has to be released to avoid resource leaks and a simple observer не видите.
Viacheslav
Когда поймёшь, что handle — это не просто указатель, даже если это внутри typedef to void*, тогда и поговорим.
Stanislav
shared_ptr<HANDLE>
Constantine
А вот если написать using HWND = std::unique_ptr<IncompleteWndType>, у вас ляжет весь код
Stanislav
Viacheslav
А какой валидный код сломается, если там будет using HWND = struct blah { ... };?
Viacheslav
Если тебе сказали, что это opaque type, и ты про него вообще ничего не должен знать?
Constantine
Constantine
И скажите, как вызывать CreateWindow
Viacheslav
Зачем? Это POD тип.
Viacheslav
Не делай никаких assumptions о том, что там лежит. И передавай в API. Всё.