考虑this代码:
2 3 4 5 6 7 8 9 10 1119
102 104 106 108 110 112 114 116 118 120
我正在使用gcc-7.0.1,here是实例。问题是这是一个编译器错误还是我做错了什么?
答案 0 :(得分:1)
让我们简化一下这个例子:
template <template <auto> class C, auto N>
void foo(C<N> ) { }
int main() {
foo(II<TEN>{} ); // ok
foo(RR<REF>{} ); // error
}
问题在于,正常的auto
扣除规则适用于N
,后者会在REF
案例中推断为int
。非类型模板参数类型 - int const&
- 和参数 - int
之间存在不匹配,因此它的格式不正确。
如果我们将示例翻转为取代auto const& N
(或auto&& N
),那么由于同样的原因,它会被II<TEN>
调用错误 - 我们' d现在获取引用类型的模板参数,但参数是非引用类型。
使用当前语言中的一个功能无法处理这两种情况。你需要两个:
template <template <auto> class C, auto N> void foo(C<N> ) { } // #1
template <template <auto&&> class C, auto&& N> void foo(C<N> ) { } // #2
int main() {
foo(II<TEN>{} ); // ok: calls #1
foo(RR<REF>{} ); // ok: calls #2
}
与原始示例相似:您需要一个值专门化和一个引用专门化。 C
的模板 - 模板非类型参数中的引用可能不是必需的。