模板参数的潜在范围是什么?

时间:2011-05-13 04:26:06

标签: c++ templates scope c++11

ISO草案n3290第3.3.9节第5段中的一点:

  

因为模板参数的名称无法在其潜在范围内重新声明       范围(14.6.1),模板参数的范围通常是其潜在的范围。然而,       仍然可以隐藏模板参数名称;

在这种情况下,“潜在范围”意味着什么?任何人都可以提供这样的例子吗?

草稿链接n3290:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf

2 个答案:

答案 0 :(得分:2)

来自同一部分的第3段:

  

模板的潜在范围   参数名称从它的位置开始   声明(3.3.2)并以此结束   声明区域结束。 [   注意:这意味着 template-parameter 可用于后续声明    template-parameters 及其默认参数但不能使用   在前面的模板参数或   他们的默认参数。例如,

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

这也意味着a    template-parameter 可用于基类的规范。对于   例如,

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

使用模板参数作为   基类意味着使用了一个类   必须定义模板参数   并且不仅仅是在课堂上宣布   模板被实例化。 - 结束记录   ]

答案 1 :(得分:2)

  

3.3.1:声明的范围是   与其潜在范围相同,除非   潜在范围包含另一个   声明同名。在那里面   案例,潜在范围   内部的声明(包含)   声明性区域被排除在外   中的声明的范围   外(含)声明区域。

通常情况下,这是指这样的情况:

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

第二个i的潜在范围被排除在第一个i的范围之外。换句话说,这准确地描述了名称隐藏适用的位置。您引用的位表示模板名称也可以隐藏。