gpt4 book ai didi

c++ - 具有 const 引用的可变参数模板特化

转载 作者:可可西里 更新时间:2023-11-01 17:38:54 26 4
gpt4 key购买 nike

如何特化具有参数常量引用的可变参数模板函数?

例子:

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

最佳答案

这是因为主模板为您的调用推导的模板参数是 intconst char*Test,而不是 常量测试&。这意味着您的特化未被使用,因为模板参数与参数不匹配。

最简单的选择是提供单独的重载而不是特化:

template <typename T>
T foo(int a, const char* str, const Test& t) { /*...*/; }

Live demo

关于c++ - 具有 const 引用的可变参数模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42853876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com