如果 Rest... 为空, template<typename T> 是否与 template<typename T, typename... Rest> 相同?

flo*_*tan 5 c++ templates language-lawyer variadic-templates

我试图在 CRTP 类中创建一个“转换复制构造函数”,如下所示: template struct Base;

template<typename Derived>
struct Base;

template<template<typename, typename...> class DerivedType, typename T, typename... Rest >
struct Base<DerivedType<T, Rest...>> {

    Base() = default;

    template<typename T2, typename... Rest2>
    Base(const Base<DerivedType<T2, Rest2...>>& other)  {
    }

};

template<typename T>
struct Child : Base<Child<T>> {

    using MyBase = Base<Child<T>>;

    Child() = default;    

    template<typename T2>
    Child(const Child<T2>& other) : MyBase(other) {}

};

int main() {

    Child<int> cti;
    Child<float> ctf = cti;

}
Run Code Online (Sandbox Code Playgroud)

该代码可以使用 never gcc 版本进行编译,但不能使用其他编译器进行编译。他们拒绝它,因为模板参数太多:

<source>:11:21: error: too many template arguments for class template 'Child'

    Base(const Base<DerivedType<T2, Rest2...>>& other)  {
Run Code Online (Sandbox Code Playgroud)

显然, 的大小Rest2...是 0,所以我希望它匹配Child<T2>

T2解决方法是从 Base 构造函数的定义中删除模板参数。但是,我很好奇这里是哪个编译器?

活生生的例子在这里