【发布时间】:2017-01-04 03:50:54
【问题描述】:
我能够生成重现问题的最少代码:
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)在编译代码时遇到以下错误:
pp.cc: In function ‘int main()’: pp.cc:14:21: internal compiler error: unexpected expression ‘Is’ of kind template_parm_index Outer<0>::Inner<w> f;
并产生冗长而无聊的堆栈跟踪。 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++ 错误还是我错过了一些关于非类型可变参数模板参数扩展的重要内容,不适用于类模板参数扩展?
【问题讨论】:
-
“内部编译器错误”显然意味着 GCC 中的错误,无论这是否是有效的 C++。
-
谢谢!我不知道...
-
语法
template <Tag<Ts> &...> struct Inner{};是什么意思? -
@Zereges 你可能熟悉模板的概念——使用其他类型参数化类型,例如
template <class T> struct X {};。除了类型,类型可以通过非类型值参数化,例如template <int N> struct X {} ;。关于什么可以是非类型模板参数的值有一定的规则。一种可能性是对静态变量的引用。此语法提供了一种方法来设置某些引用模板化静态变量的类型。 -
@W.F.我知道模板,它们可以按值参数化,但不知道对静态变量的引用。
标签: c++ templates c++14 variadic-templates non-type