O impacto do virtual no uso do modelo de membro de classe

Eu (vagamente) sei que um modelo não é instanciado se fornão usava. Por exemplo, o código a seguir irá compilar bem mesmo queT::type não faz sentido quandoT = int.

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

A<int> a; //ok

Compila porquef() não éusava, por isso não é instanciado - assim, a validade deT::type permanece desmarcada. Não importa se algum outromembro funçãog() chamadasf().

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

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

A<int> a; //ok

Isso tambémcompilar multas. Mas aqui eu percebo a imprecisão em minha compreensão da definição de"usar". Eu pergunto:

Éf() ainda não utilizado? Como exatamente?

Eu posso ver claramente que está sendo usado dentrog(). Mas então eu pensei desdeg() não é usado,f() também não é usado, do ponto de vista da instanciação. Isso parece razoável o suficiente. tão longe.

No entanto, se eu adicionarvirtual palavra-chave parag(), não 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

Isso resulta emErro de compilação porque agora ele tenta instanciarf(). Eu não entendo esse comportamento.

Alguém poderia explicar isso? Especialmente o impacto devirtual palavra-chave na definição de "uso" do modelo de membro da classe.

questionAnswers(1)

yourAnswerToTheQuestion