C++ lambda转换为bool,而不是推导函数指针类型

C++ lambda转换为bool,而不是推导函数指针类型,c++,lambda,function-pointers,ostream,template-argument-deduction,C++,Lambda,Function Pointers,Ostream,Template Argument Deduction,我想为操作符实现一个重载。您这里的问题是,模板参数推断只对传递给测试的实际参数执行。并不是对参数可能转换为的所有可能类型都这样做。这可能是一个无限集,所以这显然是不可能的 因此,模板参数推导是在实际的lambda对象上完成的,该对象具有无法描述的类类型。因此,test(T*)的推导失败,因为lambda对象不是指针T不能从测试(bool)中推断出来。最后,test(Ret(*el)(Args…)的演绎失败,因为lambda对象也不是函数的指针 有几个选择。您甚至可能不需要模板,您可以接受std:

我想为
操作符实现一个重载。您这里的问题是,模板参数推断只对传递给
测试的实际参数执行。并不是对参数可能转换为的所有可能类型都这样做。这可能是一个无限集,所以这显然是不可能的

因此,模板参数推导是在实际的lambda对象上完成的,该对象具有无法描述的类类型。因此,
test(T*)
的推导失败,因为lambda对象不是指针<显然,code>T
不能从
测试(bool)
中推断出来。最后,
test(Ret(*el)(Args…)
的演绎失败,因为lambda对象也不是函数的指针

有几个选择。您甚至可能不需要模板,您可以接受
std::function
,并依赖于它具有模板化构造函数这一事实。或者您可以只取一个
test(T)
参数,并将其称为
T()
T
现在将推断为实际的lambda类型。最奇特的解决方案可能是使用并接受模板vararg list。

模板
template<typename T>
void test(bool) {
    std::cout << "bool" << std::endl;
}
无效测试(bool){
std::cout即使非捕获lambda具有到函数指针的隐式转换,函数模板必须完全匹配才能成功进行推导,也不会执行任何转换

因此,最简单的修复方法是使用
+

int main() {
    std::boolalpha(std::cout);
    std::cout << []{return 5;} << std::endl; // true is outputted
    test(+[]{return 5;}); 
    //   ^
}
intmain(){
std::boolalpha(std::cout);

std::cout“It will not compile”显示错误消息,但使用cout时它为什么工作?这里使用了哪个重载?为了解决这个问题,我还为
test()
提供了一个
bool
重载,但它不会被使用这里没有
操作符
template<typename T>
void test(bool) {
    std::cout << "bool" << std::endl;
}
void test(bool) {
     std::cout << "bool" << std::endl;
}
int main() {
    std::boolalpha(std::cout);
    std::cout << []{return 5;} << std::endl; // true is outputted
    test(+[]{return 5;}); 
    //   ^
}