You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DMD v2.111.0中Variadic function(可变参数函数)工作异常?

DMD v2.111.0中可变参数构造函数的异常行为分析与修复

问题根源

你的代码里类P(T)的构造函数参数声明存在语法误用:

this (T[] ts...) {
    this.ts = ts;
}

这里的T[] ts...表示接受任意数量的T[]类型参数,但你调用new C(S(0))时传入的是单个S结构体实例。D编译器会尝试隐式转换,把临时生成的S(0)的内存空间当成T[]切片(64位系统下切片由指针+长度组成,占16字节),这直接导致this.ts指向了已销毁的临时对象内存,后续访问时读取到的都是随机垃圾值,属于典型的野指针访问问题。

修复方案

把构造函数的参数改为接受任意数量的T类型参数,正确的可变参数写法如下:

class P(T) {
    T[] ts;
    
    this (T ts...) { // 去掉参数类型后的[],直接以T作为可变参数的基础类型
        this.ts = ts;
    }
}

修改后,调用new C(S(0))时,传入的单个S实例会被自动打包成T[]切片赋值给this.ts,后续访问ts[0].n就能得到预期的0值。

验证结果

修复后运行代码,所有writeln的输出都会符合预期:

[S(0)]
0
S(0)
0
[S(0)]
0
0
0

是否为已知Bug?

这不是DMD的Bug,完全是代码对可变参数语法的误用。可变参数...的作用是将多个同类型参数打包成数组,当你声明T[] ts...时,要求传入的参数必须是T[]类型而非T类型,隐式转换引发的野指针访问属于代码逻辑错误。

内容的提问来源于stack exchange,提问作者L Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:19:56