gpt4 book ai didi

c++ - 为什么 C+ +'s templated class doesn' t 打破了一个定义规则?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:04 28 4
gpt4 key购买 nike

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

最佳答案

同样,任何模板定义都不会破坏 ODR — ODR 特别指出,模板定义可以在翻译单元之间重复,只要它们确实是重复的(并且,因为它们是重复,不可能有冲突或歧义)。

[C++14: 3.2/6]: There can be more than one definition of a class type (Clause 9), enumeration type (7.2), inline function with external linkage (7.1.2), class template (Clause 14), non-static function template (14.5.6), static data member of a class template (14.5.1.3), member function of a class template (14.5.1.1), or template specialization for which some template parameters are not specified (14.7, 14.5.5) in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements [..]

多次包含 <vector>在同一个翻译单元中被明确允许并有效地省略,很可能被“#ifndef”标题保护。

关于c++ - 为什么 C+ +'s <vector> templated class doesn' t 打破了一个定义规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34552380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com