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.