& 를 직접 *mut로 변경할수는 없는데
& as *const as *mut 하면 변경 되더라구요?
UnsafeCell 이 너무 궁금해서 보니까 실제로 코드도 그러한 방식으로 되어있구요.
해당 형변환에 대한 공식문서를 찾아보고싶었는데 따로 못찾았구요.
std 라이브러리는 고어들이 상당히 많더라구요. 예시로 box 문법같은거도 가끔 보여요 (잘은 모르지만 고어라고 알고있음).
그래서 혹시 const 원시포인터를 mut원시포인터로 바꾸는 행위를
사용해도 미래에 별 탈이 없을지 확인받고싶어서 글 올립니다.
딱히 다른 방법은 메소드나 트레잇을 뒤져보아도 찾기 힘들더라구요.
그렇다고 내부가변성을 해당 변환없이 구현 가능하냐? 하면 저는 음... 일단 제 실력으론 부족한거같아요.
*const 에서 *mut 으로 변환이 가능한 이유,
그리고 어째서 & 에서 바로 *mut 으로 변환할 수 없는지 그 배경이 조금 궁금하네요
& as *const as *mut 하면 변경 되더라구요?
UnsafeCell 이 너무 궁금해서 보니까 실제로 코드도 그러한 방식으로 되어있구요.
해당 형변환에 대한 공식문서를 찾아보고싶었는데 따로 못찾았구요.
std 라이브러리는 고어들이 상당히 많더라구요. 예시로 box 문법같은거도 가끔 보여요 (잘은 모르지만 고어라고 알고있음).
그래서 혹시 const 원시포인터를 mut원시포인터로 바꾸는 행위를
사용해도 미래에 별 탈이 없을지 확인받고싶어서 글 올립니다.
딱히 다른 방법은 메소드나 트레잇을 뒤져보아도 찾기 힘들더라구요.
그렇다고 내부가변성을 해당 변환없이 구현 가능하냐? 하면 저는 음... 일단 제 실력으론 부족한거같아요.
*const 에서 *mut 으로 변환이 가능한 이유,
그리고 어째서 & 에서 바로 *mut 으로 변환할 수 없는지 그 배경이 조금 궁금하네요
러스트임? - dc Cpp
취미로 배워볼만한가 - dc Cpp
&이 immutable인데 *mut로 바로 변환이 가능하겠냐? *mut가 필요하면 &mut를 써야지
std에서 &mut를 가져가버리면 다른 곳에서 &접근도 못하게 되니까 그렇게 했겠지
또 니 하고싶은 말만 대댓글로 주절주절하는거 다시 시작했네 ㅂㅂ
그냥 잘못쓰기 쉬우니까 막아둔거임
그리고 &, *const랑 &mut, *mut는 암시적으로 변환됨
포인터끼리 변환하는거 자체는 아무런 문제가 없음 그걸 역참조하거나 참조로 바꾸는게 문제인데 이건 unsafe니까 safe안에선 노상관
물론 Rust 안에서만의 얘기고 ffi에서 *mut 요구하는데 *const 던져주면 무슨 일이 일어날지 모르니까 절대 안되고
그리고 변환은 맘대로지만 &에서 *mut 만들었다고 그걸 &mut로 바꾼다던가 이딴짓하면 바로 UB임 마찬가지로 ffi로 넘겨주고 거기서 write하면 UB
그게 바로 UB라고 &가지고 write하고 있잖아
잘 모르겠으면 unsafe 쓰지마 RefCell Cell 이런 안전한 래퍼타입 써라
애초에 interior mutability가 필요하다면 디자인이 잘못됐을 가능성이 높으니 최대한 안쓰도록 해야함