也许是它的蹩脚问题,但我不明白!如果我包含
或
在多个翻译单元(不同的.cpp)中为什么它不会破坏ODR?据我所知,每个.cpp的编译方式都不同,因此将分别为每个目标文件生成vector的方法代码,对吧?所以链接器应该检测它并抱怨.即使它不会(我怀疑它是模板的特殊情况)它将在每个单元中使用一个代码或不同的克隆代码集,当我将所有链接在一起时???
同样的方式,任何模板定义都不会破坏ODR - ODR特别指出,模板定义可能会在翻译单元之间重复,只要它们实际上是重复的(并且,因为它们是重复的,所以不存在冲突或歧义).
[C++14: 3.2/6]:
类类型(第9条),枚举类型(7.2),带内部链接的内联函数(7.1.2),类模板(第14条),非静态函数模板(14.5.6)可以有多个定义,类模板的静态数据成员(14.5.1.3),类模板的成员函数(14.5.1.1),或者在程序中未指定某些模板参数(14.7,14.5.5)的模板特化,前提是每个模板定义出现在不同的翻译单元中,并且定义满足以下要求[...]
明确允许并有效地省略同一翻译单元内的多个内容,更可能是" #ifndef
"标题保护.
该标准对模板有一个特殊的例外,它允许复制否则会违反ODR的函数(例如具有外部链接和非内联成员函数的函数).来自C++ 11 3.2/5:
如果D是模板并且是在多个转换单元中定义的,则前面的要求既适用于模板定义中使用的模板封闭范围中的名称(14.6.3),也适用于实例化时的相关名称(14.6.2).如果D的定义满足所有这些要求,那么程序应该表现得就像D的单一定义一样.如果D的定义不满足这些要求,那么行为是不确定的.