|
|
|
@ -99,9 +99,9 @@ API의 사용자들은 이런 `Result`의 값이 `Err`가 되기에 *정적으
|
|
|
|
|
원칙적으로는 러스트가 이런 사실에 기반하여 몇 가지 흥미로운 분석과 최적화를 수행할 수 있을 겁니다. 예를 들어 `Result<T, Void>`는 `Err` 형이 실제로 존재하지 않기에, 그냥 `T`로 표현할 수 있겠죠
|
|
|
|
|
(엄격하게 말하면, 이것은 보장되지 않은 최적화일 뿐이고, `T`와 `Result<T, Void>` 중 하나를 다른 하나로 변질시키는 것은 아직 미정의 동작입니다).
|
|
|
|
|
|
|
|
|
|
다음의 코드도 컴파일 *될 수도 있을* 겁니다:
|
|
|
|
|
다음의 코드도 컴파일 됩니다:
|
|
|
|
|
|
|
|
|
|
```rust,compile_fail
|
|
|
|
|
```rust
|
|
|
|
|
enum Void {}
|
|
|
|
|
|
|
|
|
|
let res: Result<u32, Void> = Ok(0);
|
|
|
|
@ -110,8 +110,6 @@ let res: Result<u32, Void> = Ok(0);
|
|
|
|
|
let Ok(num) = res;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
하지만 아직 이 꼼수는 통하지 않습니다.
|
|
|
|
|
|
|
|
|
|
빈 타입에 대한 마지막 하나의 조그만 사실은, 빈 타입을 가리키는 생 포인터는 놀랍게도 유효하게 생성할 수 있지만, 그것을 역참조하는 것은 말이 안되기 때문에 미정의 동작이라는 것입니다.
|
|
|
|
|
|
|
|
|
|
우리는 C의 `void*` 타입을 `*const Void`로 설계하는 것을 추천하지 않습니다. 많은 사람들이 이렇게 했지만 얼마 지나지 않아 문제에 부딪혔는데, 러스트는 불안전한 코드로 빈 타입의 값을 만드려고 하는 것을 막는 안전 장치가 없고,
|
|
|
|
|