C ++ CRTP punto de función virtual de instanciación

Estoy tratando de entender si un patrón CRTP simple es válido según el estándar.

El código a continuación compila y funciona como se espera (en clang).

Pero mi comprensión de los capítulos / párrafos estándar relevantes es que el punto de creación de instancias de la función virtual CRTP <Derived, Base> :: DoSomething () debe estar en el punto (B) del código, donde la declaración completa de Derived no está disponible. Por lo tanto, el tipo typedef interno tampoco debería estar disponible.

¿Alguien puede indicar amablemente el capítulo estándar relevante que valida este código?

En otras palabras, ¿algo que diga que en este caso la función virtual es una instancia del punto C de ATFER? Muchas gracias de antemano por cualquier visión.

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
//-------------------------

Párrafos estándar relevantes (?):

14.6.4.1 4 Si una función virtual está instanciada implícitamente,su punto de instanciación es inmediatamente posterior al punto de instanciación de su especialización de plantilla de clase adjunta.

14.7.1 4 La especialización de una plantilla de clase se crea una instancia implícita si el tipo de clase se usa en un contexto que requiere un tipo de objeto completamente definido o si la integridad del tipo de clase podría afectar la semántica del programa.

14.7.1 9 Una implementación no creará una instancia implícitamente de una plantilla de función, una plantilla de miembro, una función de miembro no virtual, una clase de miembro o un miembro de datos estáticos de una plantilla de clase que no requiera instancia. No se especifica si una implementación crea una instancia de forma implícita de una función miembro virtual de una plantilla de clase si la función de miembro virtual no sería instanciada de otro modo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta