Naw*_*waz 12 c++ virtual templates instantiation c++11
我(含糊地)知道如果不 使用模板,则不会实例化模板.例如,以下代码将编译正常,即使T::type
没有意义T = int
.
template<typename T>
struct A
{
void f() { using type = typename T::type; }
};
A<int> a; //ok
Run Code Online (Sandbox Code Playgroud)
它编译因为f()
没有使用,所以它没有被实例化 - 因此T::type
仍然没有检查的有效性.其他成员函数g()
调用是否无关紧要f()
.
template<typename T>
struct A
{
void f() { using type = typename T::type; }
void g() { f(); } //Is f() still unused?
};
A<int> a; //ok
Run Code Online (Sandbox Code Playgroud)
这也是罚款.但在这里,我意识到我对"使用"定义的理解模糊.我问:
f()
仍未使用?究竟怎么样?我可以清楚地看到它被用在里面g()
.但后来我认为既然g()
没有使用,f()
也没有使用,从实例化的角度来看.这看起来很合理.至今.
但是,如果我添加virtual
关键字g()
,它不会编译:
template<typename T>
struct A
{
void f() { using type = typename T::type; }
virtual void g() { f(); } //Now f() is used? How exactly?
};
A<int> a; //error
Run Code Online (Sandbox Code Playgroud)
它导致编译错误,因为它现在尝试实例化f()
.我不明白这种行为.
有人可以解释一下吗?特别是virtual
关键字对类模板成员"使用"定义的影响.
Mat*_* M. 10
快速浏览3.2 [basic.def.odr]得出:
3/[...]虚拟成员函数如果不纯,则使用odr.[...]
我也发现在14.7.1 [temp.inst]:
10 /实现不应隐式实例化函数模板,成员模板,非虚拟成员函数,成员类或不需要实例化的类模板的静态数据成员.如果虚拟成员函数不会被实例化,则实现是否隐式实例化类模板的虚拟成员函数是未指定的.(强调我的)
所以......我想说一个virtual
方法很可能会被实例化.
在实用的术语中,我希望编译器在实例化类时实例化模板类的虚拟表; 并因此立即实例化该类的所有virtual
成员函数(因此它可以引用来自虚拟表的那些).