让我们举一个例子:
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
也是如此吗?任何标准的参考将非常感激。
答案 0 :(得分:1)
答案是肯定的。
来自C ++ 11标准的引用,[temp.inst] [14.7.1]:
- ...
醇>
类模板特化的隐式实例化导致隐式实例化 声明,但不是类成员的定义,默认参数或异常规范 函数,成员类,作用域成员枚举,静态数据成员和成员模板;和 它会导致隐式实例化未作用域成员枚举和成员匿名联合的定义。
第二部分提供了更多关于何时实例化成员模板 definitions 的信息。 (当它们被使用时,它通常会隐式发生:)
- 除非已明确实例化或明确实例化类模板或成员模板的成员 如果在需要成员定义存在的上下文中引用特化,则隐式实例化成员的特化;特别是,初始化(和任何相关的 除非静态数据成员本身以某种方式使用,否则不会发生静态数据成员的副作用 这需要静态数据成员的定义存在。
醇>