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 Реализация не должна неявно создавать экземпляр шаблона функции, шаблона элемента, не виртуальной функции-члена, класса-члена или статического члена данных шаблона класса, который не требует создания экземпляра. Не определено, будет ли реализация неявно создавать экземпляр виртуальной функции-члена шаблона класса, если в противном случае функция виртуального члена не была бы создана.