【问题标题】:What is the potential scope of a template parameter?模板参数的潜在范围是什么?
【发布时间】:2011-08-24 15:19:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 编辑标题以实际反映您问题的主题。
  • @Xeo:我不是在问这个吗?我不知道潜在范围的实际含义是什么?
  • 好吧,我的重新表述的问题不是正好问这个问题吗?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢你的回答,你能说出上面的例子吗?
  • 查看 14.6.1/7 中的注释示例,其中 class BA&lt;B&gt;::B 隐藏。
【解决方案2】:

来自同一部分的第 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 { /* ... */ };

使用模板参数作为 基类意味着使用的类 必须定义为模板参数 而不仅仅是在上课时声明 模板被实例化。 —结束说明 ]

【讨论】:

  • 是的,我已经看到了这一点......这就是我对潜在范围的怀疑(即意味着......本地范围等)
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 2011-01-21
  • 2021-04-29
  • 1970-01-01
  • 2020-03-23
  • 2020-10-13
  • 2013-09-23
相关资源
最近更新 更多