Ponto de função virtual C ++ CRTP da instanciação

Estou tentando entender se um simples padrão CRTP é válido pelo padrão.

O código abaixo compila e funciona como esperado (no clang).

Mas o meu entendimento dos capítulos / parágrafos padrão relevantes é que o ponto de instanciação da função virtual CRTP <Derived, Base> :: DoSomething () deve estar no ponto (B) do código, onde a declaração completa de Derived não é acessível. Portanto, o Tipo typedef interno também não deve estar disponível.

Alguém pode gentilmente apontar o capítulo padrão relevante que valida esse código?

Em outras palavras, algo que diz que, neste caso, a função virtual é instanciada ATFER ponto C? Muito obrigado antecipadamente por qualquer insight.

Francesco

//-------------------------
// START CODE

#include <iostream>

struct Type1 {};
struct Type2 {};

struct Base
{
  virtual ~Base() {}
  virtual void DoSomething() = 0;
};

template< typename T, typename U >
struct CRTP : U
{
  virtual void DoSomething() { DoSomething( typename T::Type() ); }

 void DoSomething( Type1 ) { std::cout << "1\n"; }
 void DoSomething( Type2 ) { std::cout << "2\n"; }
};

// (A) point of inst. of CRTP< Derived, Base > ( 14.7.1.4 ) ??
// (B) point of inst. of CRTP< Derived, Base >::DoSomething() (14.6.4.1.4 ) ??

struct Derived : CRTP< Derived, Base >
{
  typedef Type2 Type;
};

// (C)

int main()
{
  Base *  ptr = new Derived;
  ptr->DoSomething();
  delete ptr;
}

// END CODE
//-------------------------

Parágrafos padrão relevantes (?):

14.6.4.1 4 Se uma função virtual é implicitamente instanciada,seu ponto de instanciação é imediatamente após o ponto de instanciação de sua especialização de modelo de classe.

14.7.1 4 Uma especialização de modelo de classe é implicitamente instanciada se o tipo de classe for usado em um contexto que exija um tipo de objeto completamente definido ou se a integridade do tipo de classe puder afetar a semântica do programa.

14.7.1 9 Uma implementação não deve implicitamente instanciar um modelo de função, um modelo de membro, uma função de membro não virtual, uma classe de membro ou um membro de dados estático de um modelo de classe que não exija instanciação. Não é especificado se uma implementação implicitamente instancia ou não uma função de membro virtual de um modelo de classe se a função de membro virtual não fosse instanciada.

questionAnswers(2)

yourAnswerToTheQuestion