Я пытаюсь понять, является ли обычный шаблон CRTP стандартным.
Код ниже компилируется и работает как ожидается (на clang).
Но мое понимание соответствующих стандартных глав/пунктов гласит, что точка инстанцирования виртуальной функции CRTP < Derived, Base > :: DoSomething() должен быть в точке (B) кода, где полное объявление Derived недоступно. Поэтому внутренний тип typedef также не должен быть доступен.
Может ли кто-нибудь указать соответствующую стандартную главу, которая проверяет этот код?
Другими словами, что-то, что говорит о том, что в этом случае создается виртуальная функция ATFER точка C? Большое спасибо за любую информацию.
Франческо
//-------------------------
// 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 Реализация не должна имплицитно создавать шаблон функции, шаблон-член, не виртуальную функцию-член, класс-член или статический элемент данных шаблона класса, который не требует инсталляции. Неясно, реализует ли реализация неявно экземпляр виртуальной функции-члена шаблона класса, если бы функция виртуального члена не создавалась иначе.