docs(wiki): Implicit.md §5 同步——Ptr(同型聚合)→同型聚合值允许隐式值拷贝

This commit is contained in:
TermiNexus committed 2026-10-13 10:31:12 +08:00
1 parent 22884b7aa0
commit bb79d36fd2
1 file changed
+11 -4
+11 -4
View File
@@ -95,11 +95,14 @@
## 5. 值 ↔ 指针(聚合类型)
- 非基本类型的 `Foo* → Foo`(指针 → 值)**禁止**,仅两处豁免:
1. **构造物化**(`Foo(...)` 直接产出聚合值);
2. **值语义槽拷贝**(源是 `x: Foo` 这类「槽自身持有聚合物、`Spec.PtrLevel == 0`」)。
- **指向同型聚合的指针 → 同型聚合值**:**允许**,做隐式**值拷贝**(`load`)。
覆盖裸类形参(`elem: T`,ABI 即 `T*`)直接赋给同型值字段/变量,以及 `x: T` 这类值语义槽。
拷贝后目标独立、不会悬垂 —— 与「传参用指针」的 ABI 选择互不冲突。
- 其余 `Foo* → Foo` **禁止**(不同型聚合 / 多级指针),须显式 `*p` / `c.deref(p)` 或显式 cast;
唯一另一处豁免是**构造物化**(`Foo(...)` 直接产出聚合值)。
- 聚合值 → 指针:在栈上溢出临时(VPC 不按值传聚合)。
- **裸类形参 ABI = `T*`**:VPC 里对象本身即指针,`def f(node: T)` 的形参按对象地址传入。
- **裸类形参 ABI = `T*`**:VPC 里对象本身即指针,`def f(node: T)` 的形参按对象地址传入;
但赋给**同型值目标**时按上面的值拷贝处理(交出的是拷贝,不是地址)。
---
@@ -137,3 +140,7 @@
→ `malloc` 失败 → zlib `compress` 返回 None。
- 现在:负值 → `sext`,非负 → `zext`(引用形态无关);同时修掉 `pyzlib.Z_DEFAULT_COMPRESSION`
(`-1`)被 `zext` 成 `255` 的问题。
- **2026-10-12:`Ptr(同型聚合) → 同型聚合值` 允许隐式值拷贝**(见 §5)。
- 动机:裸类形参(`elem: T`)的 ABI 已定为 `T*`,但 `self.field = elem`(同型值字段)应是**值拷贝**;
此前要求显式解引用会误报。VPC 里裸类形参与 `p: T*` 的槽同构,故判据落在「pointee 与目标同型」
上;拷贝后目标独立,不会悬垂。