我使用模板化引用来按引用类型捕获函数,但是当我尝试通过param()调用时崩溃(使用Apple LLVM版本9.0.0(clang-900.0.38),x86_64-apple-darwin17) .2.0)
#include <iostream>
#include <typeinfo>
int doit(int a, int b) {
return a+b;
}
template <typename T>
void test(T & param) {
std::cout << typeid(T).name() << " ";
std::cout << typeid(param).name() << " ";
std::cout << param(3,5);
}
int main()
{
test(doit);
}
但是根据斯科特·迈耶斯(Scott Meyers)的书,“函数类型可以衰减为函数指针”:
void someFunc(int, double); // someFunc is a function; type is void(int, double)
template<typename T>
void f1(T param); // in f1, param passed by value
template<typename T>
void f2(T& param); // in f2, param passed by ref
f1(someFunc); // param deduced as ptr-to-func; type is void (*)(int, double)
f2(someFunc); // param deduced as ref-to-func; type is void (&)(int, double)
因此,我希望参数是对函数类型的引用并由其调用。怎么了?
更新:看来这是Clang优化程序的错误!FIX:在调用它之前评估param的值-解决这种情况!
std::cout << param << " - " << (*param)(3,5);
这似乎是Clang优化程序的错误!FIX:在调用它之前评估param的值-解决这种情况!
std::cout << param << " - " << (*param)(3,5);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句