具有 const 引用的可变参数模板特化
Variadic template specialization with const reference
如何专门化具有参数常量引用的可变参数模板函数?
示例:
template<typename T, typename... Args>
T foo(Args... args) = delete;
template<> int foo(int a, const char* str, const Test& t) { .... } // Fails to compile
//template<> int foo(int a, const char* str, Test ) { .... } // Ok
int main() {
auto i = foo<int>(10, "test string!", t);
return 0;
}
当使用声明的 const Test&
参数调用函数 foo 时,编译器无法看到专门的函数并回退到已删除的函数:
error: use of deleted function ‘T foo(Args ...) [with T = int; Args = {int, const char*, Test}]’
auto i = foo<int>(10, "test string!", t);
如果我从参数中删除 const 引用,上面的代码编译得很好。我做错了什么?
代码可以找到here
这是因为主模板为您的调用推导的模板参数是 int
、const char*
和 Test
,而不是 const Test&
。这意味着您的专业化未被使用,因为模板参数与参数不匹配。
最简单的选择是提供单独的重载而不是特化:
template <typename T>
T foo(int a, const char* str, const Test& t) { /*...*/; }
自动模板推导不够智能,无法猜测您希望它将最后一个模板参数设置为 const Test&
而不是 Test
。更确切地说,类型推导总是从类型中删除 cv 限定符。
您在此处新建显式模板实例化:
auto i = foo<int, int, const char *, const Test&>(10, "test string!", t);
如何专门化具有参数常量引用的可变参数模板函数?
示例:
template<typename T, typename... Args>
T foo(Args... args) = delete;
template<> int foo(int a, const char* str, const Test& t) { .... } // Fails to compile
//template<> int foo(int a, const char* str, Test ) { .... } // Ok
int main() {
auto i = foo<int>(10, "test string!", t);
return 0;
}
当使用声明的 const Test&
参数调用函数 foo 时,编译器无法看到专门的函数并回退到已删除的函数:
error: use of deleted function ‘T foo(Args ...) [with T = int; Args = {int, const char*, Test}]’
auto i = foo<int>(10, "test string!", t);
如果我从参数中删除 const 引用,上面的代码编译得很好。我做错了什么?
代码可以找到here
这是因为主模板为您的调用推导的模板参数是 int
、const char*
和 Test
,而不是 const Test&
。这意味着您的专业化未被使用,因为模板参数与参数不匹配。
最简单的选择是提供单独的重载而不是特化:
template <typename T>
T foo(int a, const char* str, const Test& t) { /*...*/; }
自动模板推导不够智能,无法猜测您希望它将最后一个模板参数设置为 const Test&
而不是 Test
。更确切地说,类型推导总是从类型中删除 cv 限定符。
您在此处新建显式模板实例化:
auto i = foo<int, int, const char *, const Test&>(10, "test string!", t);