Являются ли члены вложенного класса членами заключающего класса?

#c #language-lawyer #c 20

Вопрос:

Рассмотрим следующий пример [temp.dep.type] p3

 template<class T> struct A {
  typedef int M;
  struct B {
    typedef void M;
    struct C;
  };
};

template<class T> struct A<T>::B::C : A<T> {
  M m;                          // OK, A<T>​::​M
};
 

Пример подразумевает, что A является текущим классом создания экземпляра в определении A::B::C. Однако в соответствии с [temp.dep.тип#1.2]

Имя или идентификатор шаблона относится к текущему экземпляру, если он

  • […]
  • в определении шаблона основного класса или члена шаблона основного класса имя шаблона класса, за которым следует список аргументов шаблона его заголовка шаблона ([temp.arg]), заключенный в <> (или эквивалентная специализация псевдонима шаблона),
  • […]

В этом примере шаблон основного класса A означает, что класс-член C вложенного класса B является членом шаблона класса A ?

Комментарии:

1. Ваша цитата в основном относится к введенному имени класса, которое вы не используете ( A::M использовали бы введенное имя класса). непонятный для меня вопрос. A не имеет int m; ; C::M может быть только A::M (через наследование). B::M это просто сбивает с толку.

2. @Jarod42 Цитата, которую я привел, касается именно идентификатора шаблона , который может указывать на текущий экземпляр.