【问题标题】:Member class instantiation成员类实例化
【发布时间】:2015-03-05 04:43:21
【问题描述】:

N4296::14.7.1/1 [temp.inst] 告诉我们以下内容:

类模板特化的隐式实例化导致 声明的隐式实例化,但不是 定义、[...]、成员类、[...]

那条规则是关于什么的?举个例子吧:

template<class T>
class A
{
public:
    template<class W> class Y; //1, declaration
    template<class V> class U{ V v; };  //2, definition
};

A<int> a; //3, implicit instantiation
int main(){ }

//3 的隐式实例化会导致//2 和//1 的隐式实例化吗?如果是这样,使用什么模板参数来实例化这些成员类?

【问题讨论】:

  • 它们不是成员类。它们是成员模板。
  • 我不相信这是类模板专业化的实例化,除非我的标准语言被混淆了。此外,无论如何,成员类都不会被实例化。
  • @T.C.你是对的,但目前还不清楚我们如何实例化一个成员类。我想,当我们定义该类的变量时,该类正在被实例化。例如,在this 示例中,将实例化哪个类?
  • 在这种情况下,它会实例化 A&lt;int&gt;::Y 和 A&lt;int&gt;::U 的声明(就像前向声明一样),而不是定义。
  • @T.C. “实例化声明”是什么意思?标准是否明确定义了该概念?我找不到它,搜索“实例化声明”。

标签: c++ templates


【解决方案1】:

与“外部”模板相比,这些成员模板没有什么特别之处。编译器将它们作为声明读取,这样它就知道存在 A&lt;T&gt;::Y&lt;W&gt; 和 A&lt;T&gt;::U&lt;V&gt; 等名称,这与为 A 类声明模板时非常相似:

template <typename T>
class A {
     int a;
};

它也只声明了一个类A&lt;T&gt;的存在,但没有实例化它。

实例化被推迟到实际使用(或显式实例化)模板化类型,这同样适用于成员模板。

【讨论】:

  • 您的意思是模板在实例化之前不包含任何成员?当我们实例化模板时,我们也在实例化被实例化类的成员类的声明。
  • 模板是“伪代码”。编译器解析模板文本后,不存在代码或数据(尚),但编译器将在名称解析中考虑声明的名称。如果在某些时候,名称解析导致决定实际使用(其中之一)模板化名称,则编译器开始为模板化生成(=实例化)实际代码+数据类型或函数及其依赖项。
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多