C++ 显式专门化中构造函数的语法
我有以下代码:C++ 显式专门化中构造函数的语法,c++,C++,我有以下代码: class D{/* */}; class P{/* */}; class U{/* */}; // Generic version not defined template <typename R> class UEB; // Specialization template <> class UEB<D> { public: explicit UEB(D& /* r */) {} }; // Specializa
class D{/* */};
class P{/* */};
class U{/* */};
// Generic version not defined
template <typename R>
class UEB;
// Specialization
template <>
class UEB<D> {
public:
explicit UEB(D& /* r */)
{}
};
// Specialization
template <>
class UEB<P> {
public:
explicit UEB(P& /* r */)
{}
};
template <>
class UEB<U> {
public:
explicit UEB(U& /* r */)
{}
};
int main()
{
D d;
P p;
U u;
UEB<D> ud(d);
UEB<P> up(p);
UEB<U> uu(u);
return 0;
}
D类{/**/};
类P{/**/};
U类{/**/};
//未定义通用版本
模板
UEB类;
//专业化
模板
UEB类{
公众:
显式UEB(D&/*r*/)
{}
};
//专业化
模板
类UEB{
公众:
显式UEB(P&/*r*/)
{}
};
模板
UEB类{
公众:
显式UEB(U&/*r*/)
{}
};
int main()
{
D;
P;
U U;
UEB ud(d);
UEB
up(P);
UEB uu(u);
返回0;
}
使用GCC 7、8和clang以及-Wall-pedantic-Wextra
编译都很好。
然而,cppcheck抱怨UEB
和UEB
没有构造函数
因此,我将显式UEB(U&/*r*/)
更改为显式UEB(U&/*r*/)
(和p类似),它不仅仍然编译,而且cppcheck停止了抱怨
我的问题是:为什么这样做?在声明显式专用模板类的构造函数时,模板参数是否可选?cppcheck远非完美。我将发布一个答案,声称构造函数没有名称,具有特殊的声明规则,允许注入的类名和类模板名形式;现在,我确信这对于主类模板和部分专门化(如[class.ctor]和[temp.dep.type])来说是正确的,但是我找不到任何关于显式专门化的信息,似乎只允许使用注入的类名。。。那么,gcc和clang接受变通代码是错误的,还是我遗漏了什么?如果gcc和clang都同意,我倾向于相信他们:)@bullet遗憾的是,有时候gcc和clang在处理死角案例时也会同意bug,或者很少使用语法,或者对不清楚的标准措辞的解释(如本例中所示)。事实上,关于模板注入类名称的措辞似乎已经从c++11更改为c++14(由于缺陷报告)。。。