作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图通过想象神秘的构造来更全面地掌握模板语法和语义。我认为 C++11 标准不允许使用以下语法:
template <typename T>
class A
{...};
// phony "specialization"
template <typename T>
class A<int>
{...};
但是,我找不到在 C++11 标准中不允许使用此语法的地方。
C++11 标准不允许显示的语法是否正确?如果有,从哪里可以查到语法是不允许的?
最佳答案
令我感到非常惊讶的是,14.5.5 [temp.class.spec] 中没有明确声明必须在模板参数列表中使用类模板偏特化的所有模板参数。那将使template<class T> class A<int>
无效,因为 T
未在模板参数列表中使用 <int>
.
我认为你的虚假特化只是隐式无效,因为你永远无法匹配它,所以它永远无法使用。如果实例化 A<int>
然后匹配主模板。它无法匹配您的专业,因为它有一个额外的模板参数,T
,无法推断(您建议可以通过说 A<int><double>
来提供,但这不是有效的 C++ 语法,因此无济于事)。
我已经要求标准委员会澄清为什么你的虚假特化无效(显然是无效的,但我看不到它在哪里说的)。
关于c++ - 在 C++11 标准中,它在哪里禁止 'template <typename T> class A {...}; template <typename T> class A<int> {...};'(如果有的话)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27497027/
我是一名优秀的程序员,十分优秀!