最佳答案
这是在 另一个问题中提到的。
显然,类模板中的成员函数只有在使用 ODR 时才被实例化。 有人能解释一下这到底是什么意思吗? 关于单一定义规则(ODR)的维基百科文章没有提到“ ODR 使用”。
然而,标准将其定义为
名称显示为可能计算的表达式的变量 是 用过的,除非它是一个对象,以满足 出现在常量表达式(5.19)和 lvalue-to-rvalue 中 立即应用转换(4.1)。
在[ basic.def.odr ]中。
编辑: 显然这是错误的部分,整个段落包含了对不同事物的多重定义。这可能与类模板成员函数有关:
名称显示为 可能求值的表达式或候选集的成员 函数,如果通过重载分辨率选择,则从 可能求值的表达式,除非它是纯的 虚函数及其名称没有显式限定。
但是我不明白,这个规则是如何在多个编译单元之间工作的?如果显式实例化类模板,是否所有成员函数都实例化了?