类内定义的模板成员函数搭配extern template的行为疑问
问题解答
这是完全符合C++标准的正常行为,你的代码实现没有错误,extern template声明确实会抑制类内默认inline的模板成员函数的隐式实例化,具体原因如下:
extern template的核心作用:C++11引入的extern template声明,本质是给编译器传递明确指令:当前翻译单元(TU)中,不要隐式实例化指定的模板特化,该特化的实例化已经在其他TU中通过显式实例化完成。这个规则对模板类的成员函数(无论类内还是类外定义)都生效。类内inline模板成员的本质:类内定义的模板成员函数默认带
inline属性,但这里的inline是ODR(单定义规则)层面的宽容——允许该函数在多个TU中存在相同定义,而非强制要求编译器在每个使用的TU中都生成实例。当存在extern template声明时,编译器会优先遵循“不在当前TU实例化”的指令,而非inline的ODR宽容性。nm结果的一致性原因:无论优化等级(O0/O2/O3)如何,
extern template的语义是由标准强制规定的,编译器必须遵守。因此所有引用该模板特化的TU都不会生成本地实例,只会链接src.cpp.o中已有的显式实例,最终nm只能在src.cpp.o中看到对应的实例符号。
内容的提问来源于stack exchange,提问作者IceCode
相关产品推荐
相关产品推荐

