C++ 实例化类模板时,是否也实例化了成员模板声明? 所以我们举个例子: 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; } 模板结构foo { 模板无效条(无效(T::*)()){} 模板空栏(X*){} 模板空条(T**{} }; int main(){foop;}

C++ 实例化类模板时,是否也实例化了成员模板声明? 所以我们举个例子: 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; } 模板结构foo { 模板无效条(无效(T::*)()){} 模板空栏(X*){} 模板空条(T**{} }; int main(){foop;},c++,templates,instantiation,C++,Templates,Instantiation,上述类foo的实例化是否会实例化成员模板声明条,即使成员本身是模板?任何来自标准的参考都将不胜感激。答案是肯定的 引用C++11标准[temp.inst][14.7.1]: … 类模板专门化的隐式实例化导致 声明,但不是类成员的定义、默认参数或异常规范的声明 函数、成员类、作用域成员枚举、静态数据成员和成员模板;和 它导致非作用域成员枚举和成员匿名联合定义的隐式实例化 第二部分详细介绍了成员模板定义的具体实例化时间。(当使用它们时,通常隐式发生:) 除非类模板或成员模板的成员已显式实例化或显式

上述
类foo的实例化是否会实例化成员模板声明
,即使成员本身是模板?任何来自标准的参考都将不胜感激。

答案是肯定的

引用C++11标准[temp.inst][14.7.1]:


  • 类模板专门化的隐式实例化导致 声明,但不是类成员的定义、默认参数或异常规范的声明 函数、成员类、作用域成员枚举、静态数据成员和成员模板;和 它导致非作用域成员枚举和成员匿名联合定义的隐式实例化
  • 第二部分详细介绍了成员模板定义的具体实例化时间。(当使用它们时,通常隐式发生:)

  • 除非类模板或成员模板的成员已显式实例化或显式 专门化,当在要求成员定义存在的上下文中引用专门化时,隐式实例化成员的专门化;特别是,初始化(以及任何相关的 静态数据成员的副作用)不会发生,除非静态数据成员本身以某种方式使用 这要求静态数据成员的定义存在

  • 您是否询问是否实例化了无限
    foo::bar
    ?答案是否定的。@Jarod42否定,只是成员函数模板
    bar
    Posted code的声明没有compile@jpo38它在编辑后编译。