Какова потенциальная область применения параметра шаблона? - PullRequest
1 голос
/ 13 мая 2011

Точка из проекта ISO N3290, раздел 3.3.9, параграф 5:

Поскольку имя параметра шаблона не может быть повторно объявлено в пределах его потенциала scope (14.6.1), область видимости параметра шаблона часто является его потенциальной областью действия. Тем не мение, имя параметра шаблона все еще можно скрыть;

Что означает «потенциальная сфера» в этом контексте? Кто-нибудь может привести пример такого?

черновик ссылки n3290: http://www.open -std.org / jtc1 / sc22 / wg21 / docs / documents / 2011 / n3290.pdf

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

3.3.1: область действия декларации такой же, как потенциальный объем , если только потенциальная область действия содержит другую декларация с тем же именем. В этом случае, потенциальный объем из объявление во внутреннем (содержится) декларативный регион исключен из область действия декларации в внешний (содержащий) декларативный регион.

Обычно это относится к таким случаям:

void Foo(int i) {
  {
    int i = 5;
    std::cout << i;
  }
  std::cout << i;
};

Потенциальная область действия второго i исключена из области действия первого i. Другими словами, это точно описывает, где применяется сокрытие имени. Бит, который вы цитируете, говорит, что имена шаблонов тоже могут быть скрыты.

2 голосов
/ 13 мая 2011

Из пункта 3 того же раздела:

Потенциальная область действия имени параметра шаблона начинается в точке его объявления (3.3.2) и заканчивается в конце его декларативного региона.[ Примечание : это означает, что шаблон-параметр может использоваться в объявлении последующих шаблон-параметров и их аргументах по умолчанию, но не может использоваться в предыдущем template-parameters или их аргументы по умолчанию.Например,

template<class T, T* p, class U = T> class X { /* ... */ };
template<class T> void f(T* p = new T);

Это также подразумевает, что шаблон-параметр может использоваться в спецификации базовых классов.Например,

template<class T> class X : public Array<T> { /* ... */ };
template<class T> class Y : public T { /* ... */ };

Использование параметра шаблона в качестве базового класса подразумевает, что класс, используемый в качестве аргумента шаблона, должен быть определен, а не просто объявлен при создании экземпляра шаблона класса.- конечная нота ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...