当前位置:  开发笔记 > 编程语言 > 正文

为什么C++的<vector>模板化类不会破坏一个定义规则?

如何解决《为什么C++的<vector>模板化类不会破坏一个定义规则?》经验,为你挑选了2个好方法。

也许是它的蹩脚问题,但我不明白!如果我包含在多个翻译单元(不同的.cpp)中为什么它不会破坏ODR?据我所知,每个.cpp的编译方式都不同,因此将分别为每个目标文件生成vector的方法代码,对吧?所以链接器应该检测它并抱怨.即使它不会(我怀疑它是模板的特殊情况)它将在每个单元中使用一个代码或不同的克隆代码集,当我将所有链接在一起时???



1> Lightness Ra..:

同样的方式,任何模板定义都不会破坏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"标题保护.


@barney:那么那将是一种不同的语言

2> Michael Burr..:

该标准对模板有一个特殊的例外,它允许复制否则会违反ODR的函数(例如具有外部链接和非内联成员函数的函数).来自C++ 11 3.2/5:

如果D是模板并且是在多个转换单元中定义的,则前面的要求既适用于模板定义中使用的模板封闭范围中的名称(14.6.3),也适用于实例化时的相关名称(14.6.2).如果D的定义满足所有这些要求,那么程序应该表现得就像D的单一定义一样.如果D的定义不满足这些要求,那么行为是不确定的.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有