Copy / Move / CopyElision для std :: exception_ptr и объекта исключения, на который есть ссылка - PullRequest
0 голосов
/ 11 декабря 2019

Я работал над реализацией, вдохновленной выступлением Андрея Александреску об обработке ошибок в C ++ .

Я хочу знать, как обрабатывать std :: exception_ptr в конструкторах копирования / перемещения ичто происходит с действительным объектом исключения, на который есть ссылка?

Должен ли я реализовать копирование и перемещение для exception_ptr?

Копирование: Копирование необходимо для передачи исключения_птр в функции, которыебудет обрабатывать исключение.

Move: Так как exception_ptr похож на shared_ptr, имеет ли смысл его перемещать? или необходимо обеспечить перемещение, чтобы предотвратить увеличение / уменьшение счетчика ссылок?

Если я их реализую, каково должно быть состояние исключения_ptr?

Когда яскопируйте exception_ptr, в другой, оба они ссылаются на один и тот же объект исключения, что нормально.

Однако, когда я перемещаю exception_ptr, я должен установить ptr, который перемещен, в null? Что делать, если я не установил перемещенный ptr в ноль, и что это значит для следующего утверждения из здесь .

Объект исключения, на который ссылается std :: exception_ptr, остается действительным до тех пор, пока остается хотя бы один std :: exception_ptr, который ссылается на него: std :: exception_ptr является интеллектуальным указателем общего владения (примечание: это в дополнение к обычным правилам времени жизни объекта исключения)

...