ODR 和类型模板参数中的“相同的标记序列”以及“typename”与“class”

dav*_*bak 3 c++ language-lawyer

  • [免责声明#1:我实际上并不是指 C++ 标准;我指的是 C++ 标准。cppreference我指的是《定义和ODR(单一定义规则)》。]
  • [免责声明 #2:我实际上懒得尝试它,我通过参考标准 C++ 免责声明来捍卫这一点,即不需要诊断 ODR 违规行为,因此我可能不会通过尝试学到任何东西。 ]

C++ 标准(如上面#1 中所声明的)规定,不违反 ODR的要求之一是“每个定义都包含相同的标记序列”。

这看起来很清楚,除了我很好奇:

在声明模板的类型模板参数时,是否也typename不允许class在两个不同的定义(在两个不同的翻译单元等)中进行替换?

因为这些关键字通常是可以互换的。

(我知道在任何情况下都无法在模板参数中typename替换的特殊情况。)class

use*_*522 6

typenameclass不是同一个令牌。因此,是的,如果同一实体的两个定义在此方面不同,则属于 ODR 违规。

ODR 规则的编写期望模板/内联定义仅在头文件中写出一次,然后包含在其他文件中,因此不应发生此类变化。