【发布时间】:2013-11-06 23:25:15
【问题描述】:
这只是在another question 的上下文中出现的。
显然,类模板中的成员函数只有在使用 ODR 时才会被实例化。 有人可以解释这到底是什么意思。 wikipedia article on One Definition Rule (ODR) 没有提到“ODR-use”。
然而标准将其定义为
名称显示为潜在求值表达式的变量 是 odr-used 除非它是满足要求的对象 出现在常量表达式 (5.19) 和左值到右值 立即应用转换 (4.1)。
在 [basic.def.odr] 中。
编辑:显然这是错误的部分,整个段落包含不同事物的多个定义。这可能与类模板成员函数相关:
一个非重载函数,其名称显示为 潜在评估的表达式或一组候选者的成员 函数,如果在从一个引用时通过重载决议选择 可能求值的表达式,是 odr 使用的,除非它是纯粹的 虚函数及其名称没有明确限定。
但我不明白,这条规则如何跨多个编译单元起作用?如果我显式实例化类模板,是否所有成员函数都实例化了?
【问题讨论】:
-
注意[basic.def.odr]/6适用于类模板的成员函数“可以有多个定义[...]”
-
“如果我显式实例化一个类模板,是否所有成员函数都实例化了?” 是的,参见 [temp.explicit]/8+9
标签: c++ templates one-definition-rule