虚拟对使用类模板成员的影响

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成员函数(因此它可以引用来自虚拟表的那些).