Почему `* mut T` реализует` Unwindsafe`, а `& mut T` - нет? - PullRequest
4 голосов
/ 17 июня 2020

В документации для Unwindsafe у нас есть:

Типы, такие как &mut T и &RefCell<T>, являются примерами, которые не расслабиться безопасно. Общая идея состоит в том, что любое изменяемое состояние, которое может быть совместно использовано в catch_unwind, по умолчанию небезопасно. Это потому, что очень легко увидеть нарушенный инвариант за пределами catch_unwind, поскольку к данным просто обращаются как обычно.

После этого logi c мне кажется, что *mut T должен не быть Unwindsafe. Но оказывается, что это . Почему?

1 Ответ

3 голосов
/ 17 июня 2020

*mut T является необработанным указателем, он не имеет никакого инварианта.

Может быть нулевым, указывать на недопустимую память, это Copy, и вы можете иметь два из них, указывающие на одно и то же область в памяти.

В любом случае вы ничего не можете сделать взаимозаменяемо и безопасность с *mut T, поэтому у него нет причин не быть Unwindsafe.

...