C ++对函数的调用崩溃

巴尼

我使用模板化引用来按引用类型捕获函数,但是当我尝试通过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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章