Сейчас я изучаю некоторые навыки метапрограммирования из выражений непостоянных констант , и я чувствую растерянность по поводу "Точки инстанцирования". Автор говорит
Всякий раз, когда на специализацию шаблона ссылаются в контексте, который требует инстанцирования, этот контекст порождает «точку инстанцирования» (которая фактически обозначает место, где компилятору разрешено генерировать код для указанной специализации шаблона).
Если на специализацию шаблона X ссылаются в контексте, который зависит от параметра-шаблона некоторого окружающего шаблона Y, данная точка инстанции зависит от точки инстанции Y.
- Если X является специализацией шаблона функции, то точка инстанцирования - это точка Y.
- Если X является специализацией шаблона класса, точка его создания находится непосредственно перед точкой создания Y.
В противном случае данный момент создания экземпляра привязывается к расположению декларации / определения области действия пространства имен (D), в котором содержится оператор, ссылающийся на X.
- Если X является специализацией шаблона функции, точка создания находится сразу после D.
- Если X является специализацией шаблона класса, точка создания находится непосредственно перед D.
Я не знаю, что такое «на специализацию шаблона X ссылаются в контексте, который зависит от параметра-шаблона какого-то окружающего шаблона Y», он имеет в виду
template<typename T>
class Y{
template<typename U1> void X1(){...};
template<typename U2> class X2{...};
}
Рассмотрим экземпляры Y<int>::X1<int>(...)
, X1
и Y
одновременно.
Рассмотрим Y<int>::X2<int>{...}
, X2
первый Y
второй.