From bb79d36fd2a0460a855612ca386466120a46c190 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 13 Oct 2026 10:31:12 +0800 Subject: [PATCH] =?UTF-8?q?docs(wiki):=20Implicit.md=20=C2=A75=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E2=80=94=E2=80=94Ptr(=E5=90=8C=E5=9E=8B=E8=81=9A?= =?UTF-8?q?=E5=90=88)=E2=86=92=E5=90=8C=E5=9E=8B=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=80=BC=E5=85=81=E8=AE=B8=E9=9A=90=E5=BC=8F=E5=80=BC=E6=8B=B7?= =?UTF-8?q?=E8=B4=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Implicit.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Implicit.md b/Implicit.md index 8454adc..c176e07 100644 --- a/Implicit.md +++ b/Implicit.md @@ -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 与目标同型」 + 上;拷贝后目标独立,不会悬垂。