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(由于缺陷报告)。。。