C++ gcc中的错误与const&;模板参数?

C++ gcc中的错误与const&;模板参数?,c++,templates,c++17,auto,non-type,C++,Templates,C++17,Auto,Non Type,考虑代码: #包括 模板struct II{}; 模板struct RR{}; template

考虑代码:

#包括
模板struct II{};
模板struct RR{};

template让我们稍微简化一下示例:

template <template <auto> class C, auto N>
void foo(C<N> ) { }

int main() {
    foo(II<TEN>{} ); // ok
    foo(RR<REF>{} ); // error
}

与您的原始示例类似:您需要一个值专门化和一个引用专门化。
C
的模板非类型参数中的引用可能不是必需的

我猜:一个普通的
auto
(从
非类型
)无法推断出一个引用类型,它与
(至少它与
常量auto和非类型
)下推导出的内容相匹配
常量int&
)@PiotrSkotnicki不认为它与
decltype(auto)一起工作是有意义的吗
?@user975989我认为匹配模板专门化归结为推断发明函数模板的类型,
decltype(auto)
没有任何用处
template <template <auto> class C, auto N>
void foo(C<N> ) { }

int main() {
    foo(II<TEN>{} ); // ok
    foo(RR<REF>{} ); // error
}
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
}