直接回答:const generics 允许把常量值(目前主要是 usize、bool、整数、char)作为泛型参数,典型形态是 struct ArrayVec<T, const N: usize>——容量成为类型的一部分。它解决的问题:数组长度从 1 到 32 各写一遍 impl 的历史终结了,标准库可以为任意长度数组统一实现 trait;库作者可以把缓冲区大小、矩阵维度等编码进类型,编译期检查维度匹配。
展开解析:典型应用:固定大小缓冲区的无堆分配容器(embedded 场景刚需);线性代数库在编译期保证矩阵乘法维度相容;网络协议解析里定长字段的类型化。与运行时参数的区别在于:每个不同的 N 单独单态化生成代码,类型层面可证明 N 不变。当前限制:只支持完整求值的常量表达式,泛型参数参与的表达式(如 [T; N + 1])需要尚不稳定的 generic_const_exprs 特性,这是实现 FFT、张量库的主要痛点;workaround 是用 typenum 这类类型级编码库,但错误信息可读性差。面试加分点:min_const_generics 2021 年稳定,完整 const generics 仍在演进;评估是否引入时权衡编译期保证的收益与错误信息复杂度、编译时间的代价。
追问方向:单态化对二进制体积有什么影响?与 C++ 非类型模板参数有何异同?
(约 470 字)