【问题标题】:Friend declaration and explicit template instantiation declaration友元声明和显式模板实例化声明
【发布时间】:2015-10-01 20:37:21
【问题描述】:

假设我有一个函数模板

template <typename T>
void f(T) {}

然后,我们可以有一个朋友声明

friend void f<int>(int);

和一个显式的模板实例化声明

extern template void f<int>(int);

这两个声明是否以某种方式相关或完全独立?如果相关,它们如何相互作用?

【问题讨论】:

  • 请更详细地定义相关friend 声明与 extern 声明不同或在某种程度上相关。您是否有某个标准部分?

标签: c++ templates c++11 language-lawyer explicit-instantiation


【解决方案1】:

friend 声明不与任何事物“交互”,除了声明为友元的函数定义,允许访问包含该声明的类的私有成员。

所以,不,friend 声明和 extern template 声明之间没有特殊的交互,尽管它们都引用同一个函数(从这个意义上说,它们是相关的,但我假设你在你的时候意识到了这一点写了问题)。

【讨论】:

  • 不会将带有此类显式模板参数的友元声明视为隐式实例化吗?这几乎与显式实例化有关(没有extern)。
  • @0x499602D2 我明白你在说什么,但我认为它不符合隐式实例化的条件。 g++ 似乎同意我的看法 - 快速测试表明没有发出实例化。
  • 来自规范:“当在需要函数定义存在的上下文中引用特化时,会隐式实例化函数模板特化”
  • @davmac 我想知道为什么在引用的规范中使用了术语 specialization。我认为无论如何它应该与模板专业化无关。
  • @Lingxi 我认为该规范是指任何带有类型参数的模板作为特化应用。提供替代定义的特化是 explicit 特化:“可以为函数模板、类模板、类模板的成员或成员模板声明显式特化。显式特化声明是由模板"引入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
相关资源
最近更新 更多