有错误标识的一行报错
疑问:为什么std::function的模板实参中有形参包就推导失败?是因为形参包没有被正确展开吗?
请教~
有错误标识的一行报错
疑问:为什么std::function的模板实参中有形参包就推导失败?是因为形参包没有被正确展开吗?
请教~
该回答引用自GPT-3.5,由博主GISer Liu编写:
这个问题涉及到C++模板参数推导的规则以及std::function
模板的特性。在C++中,模板参数推导是根据函数参数类型来确定的。当我们尝试将一个带有形参包的函数作为std::function
的模板参数时,编译器无法推导出确切的函数类型,因为形参包并没有具体的类型信息。下面是一个简单的例子来说明这个问题:
#include <functional>
template <typename... Args>
void foo(Args... args) {}
int main() {
std::function<void()> func = foo; // 这行报错
return 0;
}
以上代码中,foo
是一个模板函数,接受可变数量的参数。然而,在尝试将foo
赋值给std::function
对象时,编译器无法推导出std::function
的模板参数,因为无法确定foo
的确切类型。为了解决这个问题,我们可以使用std::function
的构造函数,明确指定模板参数,如下所示:
#include <functional>
template <typename... Args>
void foo(Args... args) {}
int main() {
std::function<void()> func = std::function<void()>(foo);
return 0;
}
通过显式地指定std::function
的模板参数为void()
,我们解决了模板参数推导失败的问题。
如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订