El impacto de virtual en el uso de miembros de plantilla de clase

Yo (vagamente) sé que una plantilla no se crea una instancia si esno usado. Por ejemplo, el siguiente código se compilará bien aunqueT::type no tiene sentido cuandoT = int.

template<typename T>
struct A
{
    void f() { using type = typename T::type; }
};

A<int> a; //ok

Se compila porquef()&nbsp;no esusado, por lo que no se instancia, por lo tanto la validez deT::type&nbsp;permanece sin marcar No importa si algún otromiembro&nbsp;funcióng()&nbsp;llamadasf().

template<typename T>
struct A
{
    void f() { using type = typename T::type; }

    void g() { f(); } //Is f() still unused?
};

A<int> a; //ok

Esto tambiéncompilar multas. Pero aquí me doy cuenta de la vaguedad en mi comprensión de la definición de"utilizar". Pregunto:

Esf()&nbsp;aún sin usar? ¿Cómo exactamente?

Puedo ver claramente que se usa dentrog(). Pero entonces pensé yag()&nbsp;no es usado,f()&nbsp;Tampoco se utiliza, desde el punto de vista de la instanciación. Eso parece bastante razonable. hasta aquí.

Sin embargo si agregovirtual&nbsp;palabra clave parag(), no compila:

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

En resultado deerror de compilación&nbsp;Porque ahora intenta instanciarf(). No entiendo este comportamiento.

¿Alguien podría explicar esto? Especialmente el impacto devirtual&nbsp;palabra clave en la definición de "uso" de miembro de plantilla de clase.