使用const&和gcc中的错误模板参数?

时间:2017-02-09 09:43:56

标签: c++ templates c++17 auto non-type

考虑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是实例。问题是这是一个编译器错误还是我做错了什么?

1 个答案:

答案 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的模板 - 模板非类型参数中的引用可能不是必需的。