беглом чтении не увидел.
ищи explicit template instantiation
Это проще всего понять, подумав как работает CRTP: template<class Derived> struct Base { Derived& self() { return static_cast<Derived&>(*this); } }; struct D : Base<D> {}; Рассмотрим момент инстанцирования Base<D>. Компилятор встречает Base<D> в списке баз, ему надо проверить, что класс существует и он complete, для этого он идет его инстанцировать, но пока он это не сделает, он не пометит, что D наследуется от Base<D>. Если бы в этот момент произошло инстанцирование тела метода Base<D>::self(), static_cast был бы ошибочным.
формально: http://eel.is/c++draft/temp.inst#2.1
Обсуждают сегодня