【问题标题】:Where is the normative rule that restricts what the declaration can be in a explicit specialization?在显式专业化中限制声明可以是什么的规范规则在哪里?
【发布时间】:2021-08-16 03:01:38
【问题描述】:

关于显式特化的语法

显式专业化:

模板 声明

声明:

  • 块声明
  • nodeclspec-function-declaration
  • ...
  • 显式实例化
  • ...

声明可以是任何对其语法有效的声明。考虑这个例子

template<class T>
struct A{
  template<class Y>
  struct B{};
};

template<>
template struct A<int>::B<int>;  //declaration: explicit-instantiation

GCC 和 Clang 都无法识别 syntax。限制声明不能显式实例化的规则在哪里?

【问题讨论】:

  • A 的显式特化中,没有迹象表明它应该有一个内部B
  • @cigien 这是一个声明,根据 [dcl.dcl#dcl.pre-1], declaration: explicit-instantiation。您的链接无法打开。
  • @jxh A&lt;int&gt; 是一种特化,它会导致该特化的隐式实例化。 template&lt;&gt; template&lt;&gt; struct A&lt;int&gt;::B&lt;int&gt;{}; 有效。
  • 也许我今天很慢,但声明不应该是 template&lt;&gt; template &lt;&gt; struct A&lt;int&gt;::B&lt;int&gt;; 吗? (注意第二次使用 template 关键字后额外的 &lt;&gt; 对)。
  • @xmh0511 我承认有点困惑。您希望两种不同的语法具有相同的语义吗?

标签: c++ language-lawyer


【解决方案1】:

正如您所提到的,显式特化的语法需要在template&lt;&gt; 之后的声明。但是,仅仅因为某些语法满足语法产生规则,它不一定是有效的代码。

在显式特化的情况下,可以使用此语法显式特化的实体列在temp.expl.spec#1

以下任何一项的明确特化:

(1.1) 函数模板

(1.2) 类模板

...

可以通过template&lt;&gt;引入的声明来声明...

语法template struct A&lt;int&gt;::B&lt;int&gt;;是一个显式实例化,这里没有列出,因为它不是一个可以显式特化的实体。

【讨论】:

  • 我不认为template&lt;&gt; struct A&lt;int&gt;::B&lt;int&gt; 是一个类模板。如何接受?
  • @xmh0511 成员类模板,可以按照eel.is/c++draft/temp.expl.spec#15进行特化
  • template&lt;&gt; struct A&lt;int&gt;::B&lt;int&gt; 本身不是成员类模板,它是该成员类模板的显式特化。类比,template struct A&lt;int&gt;::B&lt;int&gt; 是该成员类模板的显式实例化。
  • 我也认为该列表只是讨论了哪些实体可以明确专门化,它并不限制方法的方式。
  • 我期待 [temp.expl.spec] 中的一些规则类似于 [temp#pre-2] 指定声明的内容。同样,您在此处引用的引用只是关于哪些实体可以是显式专业化的,它并没有限制 declaration 应该是什么。线索是可以通过a declaration来声明
猜你喜欢
  • 2023-03-25
  • 2014-12-07
  • 2023-04-10
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2019-11-02
相关资源
最近更新 更多