17 Templates [temp]

17.6 Name resolution [temp.res]

17.6.2 Dependent names [temp.dep]

17.6.2.2 Type-dependent expressions [temp.dep.expr]

За исключением случаев, описанных ниже, выражение зависит от типа, если какое-либо подвыражение зависит от типа.

this зависит от типа, если тип класса включающей функции-члена зависит ([temp.dep.type]).

Зависит от id-expression типа, если он содержит

  • identifier , связанный с именем поиска с одним или более деклараций объявлен с зависимым типом,

  • identifier , связанный с именем поиска с не-типа template-parameter объявлена с типом , который содержит placeholder type,

  • identifier, связанный с именем поиска с одним или более деклараций функций членов текущего экземпляра объявленных с типом возвращаемого , который содержит тип заполнителя,

  • identifier, связанный с именем поиском с structured binding declaration которого brace-or-equal-initializerявляется типом-зависимым,

  • identifier _­_­func_­_­, где любая вмещающих функция представляет собой шаблон, член шаблона класса, или общая лямбду,

  • template-id , что зависит,

  • a, conversion-function-id который указывает зависимый тип, или

  • a nested-name-specifier или a, в qualified-id котором упоминается член неизвестной специализации;

или если он называет зависимый член текущего экземпляра, который является статическим элементом данных типа «массив неизвестных границ T» для some T ([temp.static]). Выражения следующих форм зависят от типа, только если тип, указанный с помощью type-id, simple-type-specifier или new-type-id является зависимым, даже если любое подвыражение зависит от типа:

simple-type-specifier ( expression-listopt )
::opt new new-placementopt new-type-id new-initializeropt
::opt new new-placementopt ( type-id ) new-initializeropt
dynamic_cast < type-id > ( expression )
static_cast < type-id > ( expression )
const_cast < type-id > ( expression )
reinterpret_cast < type-id > ( expression )
( type-id ) cast-expression

Выражения следующих форм никогда не зависят от типа (поскольку тип выражения не может быть зависимым):

literal
postfix-expression . pseudo-destructor-name
postfix-expression -> pseudo-destructor-name
sizeof unary-expression
sizeof ( type-id )
sizeof ... ( identifier )
alignof ( type-id )
typeid ( expression )
typeid ( type-id )
::opt delete cast-expression
::opt delete [ ] cast-expression
throw assignment-expressionopt
noexcept ( expression )

[ Note: Для стандартного библиотечного макроса offsetofсм [support.types].. ]end note

A class member access expression зависит от типа, если выражение относится к члену текущего экземпляра, а тип указанного члена является зависимым, или если выражение доступа к члену класса относится к члену неизвестной специализации. [ Note: В выражении формы x.y или xp->y типа выражения обычно является тип члена y класса x (или класса, на который указывает xp). Однако, если x или xp относится к зависимому типу, который не является текущим экземпляром, тип y всегда является зависимым. Если x или xp относится к независимому типу или относится к текущему экземпляру, тип y является типом выражения доступа к члену класса. ]end note

A braced-init-listзависит от типа, если какой-либо элемент зависит от типа или является расширением пакета.

A fold-expressionзависит от типа.