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

为何模板非类型参数不叫“值参数”?命名溯源疑问

非类型模板参数命名的起源与争议

早期C++模板设计阶段,参数体系其实只有两类:类型参数(比如template<typename T>里的T)和非类型参数。当时模板模板参数虽然已经存在,但并没有被明确划分为独立的第三类,而是作为特殊参数形式被归在早期的框架里。

之所以叫“非类型”而非“值参数”,核心原因是这类参数的范畴远不止“值”这么简单:

  • 它可以是编译期常量,比如template<int N>里的数组大小N;
  • 也可以是编译期可见的指针、引用,比如template<int* P>或者template<const char& S>;
  • 甚至C++17引入auto作为非类型参数后,它能接受的编译期实体类型更宽泛,比如枚举值、std::integral_constant这类类型的实例。

如果叫“值参数”,会把它的范围限定得太窄,无法涵盖所有合法的非类型参数形式。

后来C++标准明确了第三类参数——模板模板参数(比如template<template<typename> class C>里的C),但此时“非类型参数”的命名已经成为行业通用术语,标准委员会没有选择修改原有命名来适配三分法。一方面是因为修改会打破长期形成的编程习惯,增加学习和迁移成本;另一方面,模板模板参数的定位是“接受模板作为实参的参数”,和非类型参数的“接受编译期常量/实体”完全是两个不同的维度,没必要强行纳入“非类型”的范畴。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:25:21