C++中模板特化的顺序

use*_*922 14 c++ templates generic-programming

模板专业化在代码中出现的顺序是否会改变程序的含义?如果是这样,为什么呢?

例:

在源代码中的某个地方

// specialization A
...
// specialization B
...
Run Code Online (Sandbox Code Playgroud)

// specialization B
...
// specialization A
...
Run Code Online (Sandbox Code Playgroud)

这会产生相同的结果吗?

Ste*_*ano 31

为函数模板,类模板,类模板的成员函数,类模板的静态数据成员,类模板的成员类,类模板的成员类模板,类模板的成员函数模板,成员的成员函数放置显式特化声明类模板的模板,非模板类的成员模板的成员函数,类模板的成员类的成员函数模板等,类模板的部分特化声明的放置,非模板类的成员类模板,成员类模板等的类模板可以根据显式特化声明的相对位置及其在翻译单元中的实例化点的相对位置来影响程序是否格式良好,如上下文所述.写专业时,要注意它的位置; 或者使它编纂将是一种试图点燃其自焚的试验.

简单地引用部分14.7.3/7的的2011年国际标准的C++编程语言

是的......这不是笑话

  • 我喜欢这篇文章如何包含模板概念中16种不同变体的列表,其次是"等" (4认同)
  • 这是[`[temp.expl.spec]/7`](http://eel.is/c++draft/temp.expl.spec#7)(我不得不寻找它,抱歉我没有盲目地相信你那个). (3认同)
  • 如果您不想自己阅读:) https://youtu.be/ZLNq-4IiNTY?t=1m31s (3认同)
  • 在C++ 17选秀中它是17.8.3/7.它甚至还有更多东西.结果语言律师_do_有幽默感. (2认同)
  • 这是该引用的修剪版本(我觉得更容易阅读):*"显式特化声明的放置[...]和部分特化声明的放置[...]会影响程序是否格式正确[...].在写专业时,要小心它的位置;或者使它编译将是一个试图点燃其自焚的试验."* (2认同)

Bat*_*eba 13

只要依赖专业化的代码片段已经看到它们,顺序无关紧要.

换句话说,订单会很重要

// specialization A
// Some code where B would be a better match
// specialization B
Run Code Online (Sandbox Code Playgroud)

  • 但请注意,这并不一定意味着必须在两个专业之间出现一些问题.特别是,如果"specialization A"是一个显式的特化定义,并且该定义*包含*"某些代码,其中B将是一个更好的匹配"(并且B尚未声明),bang,undefined行为.(这通常可以通过声明然后定义特化来解决.) (2认同)