为什么标准禁止朋友声明部分专业化?

Mik*_*han 16 c++ friend template-specialization

C++标准禁止朋友声明部分特化.(§14.5.3/ 8):

朋友声明不得声明部分专业化.[例:

template<class T> class A { };
class X {
    template <class T> friend class A<T*>;   //error
};
Run Code Online (Sandbox Code Playgroud)

- 末端示例]

其他问题,例如这个问题,已经收到了援引这一禁令的答案,但我想知道其基本原理.我没有看到它,也无法用我最喜欢的搜索引擎找到它.然而,我可以发现它可以追溯到C++ 98标准,所以大概是基本的和清晰的.有人可以向我解释一下吗?

fat*_*ihk 0

这是一些间接的解释: http://www.cprogramming.com/tutorial/template_specialization.html

最后的实现细节涉及部分特化:如果存在完全泛型类型、一些部分特化,甚至可能是一些完全特化的组合,编译器如何选择要使用的特化?一般经验法则是,编译器将选择最具体的模板特化 - 最具体的模板特化是其模板参数将被其他模板声明接受的模板特化,但不会接受其他模板使用的所有可能的参数。相同的名字会接受。

我推断,也许不允许在确定专业化类型时防止出现任何歧义。