实例化类模板时,是否还实例化了成员模板声明?

时间:2016-01-19 19:08:06

标签: c++ templates instantiation

让我们举一个例子:

template<typename T> struct foo
{
    template<typename X> void bar(void (T::*)()) {}
    template<typename X> void bar(X*) {}
    template<typename X> void bar(T**) {}
};

int main() { foo<int> p; }

即使成员本身是模板,上述class foo<int>实例化成员模板声明 bar也是如此吗?任何标准的参考将非常感激。

1 个答案:

答案 0 :(得分:1)

答案是肯定的。

来自C ++ 11标准的引用,[temp.inst] [14.7.1]:

  
      
  1. ...
      类模板特化的隐式实例化导致隐式实例化   声明,但不是类成员的定义,默认参数或异常规范   函数,成员类,作用域成员枚举,静态数据成员和成员模板;和   它会导致隐式实例化未作用域成员枚举和成员匿名联合的定义。
  2.   

第二部分提供了更多关于何时实例化成员模板 definitions 的信息。 (当它们被使用时,它通常会隐式发生:)

  
      
  1. 除非已明确实例化或明确实例化类模板或成员模板的成员   如果在需要成员定义存在的上下文中引用特化,则隐式实例化成员的特化;特别是,初始化(和任何相关的   除非静态数据成员本身以某种方式使用,否则不会发生静态数据成员的副作用   这需要静态数据成员的定义存在。
  2.