c – 扩展非类型参数包以定义具有非类型模板参数的内部类模板是否合法?

我能够生成的最小代码来重现问题:

template <int>
struct Tag { };

Tag<0> w;

template <int... Is>
struct Outer {
   template <Tag<Is> &...>
   struct Inner {
   };
};

int main() {
   Outer<0>::Inner<w> f;
}

g(版本6.1.1 20160511)在编译代码时遇到以下错误:

06001

并产生长而无聊的堆栈跟踪.版本3.6.0中的clang似乎没有编译代码的任何问题.具有类型模板参数的相同代码在两个编译器中编译得很好:

template <class>
struct Tag { };

Tag<int> w;

template <class... Ts>
struct Outer {
   template <Tag<Ts> &...>
   struct Inner {
   };
};

int main() {
   Outer<int>::Inner<w> f;
}

那么它是一个g bug还是我遗漏了一些关于非类型可变参数模板参数扩展的重要内容,它不适用于类模板参数扩展?

最佳答案
(不是答案,但有人可能会感兴趣)

GCC可能相对简单的解决方法:

template <int>
struct Tag { };

Tag<0> w;

template <class... Ts>
struct OuterParent {
   template <Ts&...>
   struct Inner {
   };
};

template <int... Is>
struct Outer:OuterParent<Tag<Is>...> {
};

int main() {
   Outer<0>::Inner<w> f;
}

转载注明原文:c – 扩展非类型参数包以定义具有非类型模板参数的内部类模板是否合法? - 代码日志