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

发布于 2024-11-07 03:10:34 字数 381 浏览 0 评论 0原文

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

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

在这种情况下,“潜在范围”是什么意思?有人能提供这样的例子吗?

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

A point from ISO draft n3290 section 3.3.9 paragraph 5:

Because the name of a template parameter cannot be redeclared within its potential
scope (14.6.1), a template parameter’s scope is often its potential scope. However,
it is still possible for a template parameter name to be hidden;

What does "potential scope" mean in this context? Can anybody provide an example of such?

draft link n3290: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

埋葬我深情 2024-11-14 03:10:34

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

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

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

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

3.3.1 : The scope of a declaration is the
same as its potential scope unless
the potential scope contains another
declaration of the same name. In that
case, the potential scope of the
declaration in the inner (contained)
declarative region is excluded from
the scope of the declaration in the
outer (containing) declarative region.

Normally, this refers to cases like this:

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

The potential scope of the second i is excluded from the scope of the first i. In other words, this describes precisely where name hiding applies. The bit you quote says that template names can be hidden, too.

后eg是否自 2024-11-14 03:10:34

来自同一节的第 3 段:

模板的潜在范围
参数名称从其点开始
声明(3.3.2)并结束于
其声明区域的末尾。 [
注意:这意味着模板参数可以在后续的声明中使用
模板参数及其默认参数,但无法使用
在前面的模板参数中或
他们的默认参数。例如,

模板类 X { /* ... */ };
模板<类T>无效 f(T* p = 新 T);

这也意味着
模板参数可以在基类的规范中使用。为了
例如,

模板类X:公共数组 { /* ... */ };
模板<类T> Y 类:公共 T { /* ... */ };

使用模板参数作为
基类意味着使用了一个类
作为模板参数必须定义
而不仅仅是在上课时声明
模板被实例化。 -尾注
]

From paragraph 3 of the same section:

The potential scope of a template
parameter name begins at its point of
declaration (3.3.2) and ends at the
end of its declarative region. [
Note: This implies that a template-parameter can be used in the declaration of subsequent
template-parameters and their default arguments but cannot be used
in preceding template-parameters or
their default arguments. For example,

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

This also implies that a
template-parameter can be used in the specification of base classes. For
example,

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

The use of a template parameter as a
base class implies that a class used
as a template argument must be defined
and not just declared when the class
template is instantiated. —end note
]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文