C ++ CRTP виртуальная функция точка создания

Я пытаюсь понять, является ли стандартным простой шаблон CRTP.

Код ниже компилируется и работает как положено (на Clang).

Но мое понимание соответствующих стандартных глав / параграфов состоит в том, что точка создания виртуальной функции CRTP <Derived, Base> :: DoSomething () должна находиться в точке (B) кода, где полное объявление Derived не является доступный. Поэтому внутренний тип typedef также не должен быть доступен.

Может ли кто-нибудь указать на соответствующую стандартную главу, которая подтверждает этот код?

Другими словами, что-то, что говорит о том, что в этом случае виртуальная функция создается ATFER точка C? Заранее большое спасибо за понимание.

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

Соответствующие (?) Стандартные абзацы:

14.6.4.1 4 Если виртуальная функция создается неявно,точка его создания сразу следует за точкой его специализации с включенным шаблоном класса..

14.7.1 4 Специализация шаблона класса неявно создается, если тип класса используется в контексте, который требует полностью определенного типа объекта, или если полнота типа класса может повлиять на семантику программы.

14.7.1 9 Реализация не должна неявно создавать экземпляр шаблона функции, шаблона элемента, не виртуальной функции-члена, класса-члена или статического члена данных шаблона класса, который не требует создания экземпляра. Не определено, будет ли реализация неявно создавать экземпляр виртуальной функции-члена шаблона класса, если в противном случае функция виртуального члена не была бы создана.

Ответы на вопрос(2)

Ваш ответ на вопрос