【发布时间】:2016-04-05 18:39:06
【问题描述】:
也许这是个蹩脚的问题,但我不明白!
如果我在多个翻译单元(不同的 .cpp)中包含 <string> 或 <vector>,为什么它不会破坏 ODR?
据我所知,每个 .cpp 的编译方式都不同,因此将为每个目标文件分别生成向量的方法代码,对吧?
所以链接器应该检测到它并抱怨。
即使不会(我怀疑这是模板的特殊情况),当我将所有内容链接在一起时,它是否会在每个单元中使用一个代码或一组不同的克隆代码???
【问题讨论】:
-
本质上,编译器和链接器共同使用内联函数使用的相同机制使其工作。
-
您怀疑这是模板的特殊情况,例如内联函数。不同文件中的定义应该完全正确,不违反ODR。
-
barney:您为什么不尝试在 ODR 中挑选出您认为被违反的特定短语,以及为什么规定的例外情况不适用?
标签: c++ templates language-lawyer one-definition-rule