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

ODR规则下,模板参数中typename与class替换是否违反相同token序列要求?

模板参数中typename与class替换是否违反ODR?

免责声明

  • 本文参考cppreference的“Definitions and ODR (One Definition Rule)”内容,而非C++官方标准。
  • 未做实际测试,理由是C++标准规定ODR违规无需强制诊断,测试无法确保能获取有效结论。

cppreference指出,不违反单一定义规则(ODR)的要求之一是每个定义由相同的token序列构成。这里存在疑问:在模板的类型模板参数声明中,若在不同翻译单元的定义里将typename替换为class(已知模板模板参数中typename无法替换class的特殊情况除外),是否会违反该要求?


结论

不会违反ODR。

在类型模板参数的声明场景下,typename和class属于语义等价的关键字,C++标准将二者视为同一类语法token。cppreference所要求的“相同token序列”,指的是语义层面的token一致性,而非单纯的字面字符匹配。

举个实际的例子,以下两个分属不同翻译单元的模板定义完全符合ODR:

// 翻译单元1
template <typename T>
void print(T val) { /* 实现代码 */ }
// 翻译单元2
template <class T>
void print(T val) { /* 与翻译单元1完全相同的实现 */ }

这是因为标准明确规定,在声明类型模板参数时,class和typename可以互换使用,二者在该语境下的token属性完全一致,不会被编译器判定为不同的token序列,因此不会触发ODR违规。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:15:32