函数的C++引用在调用中崩溃

bar*_*ney 6 c++ templates reference function

我使用模板化引用来通过引用函数类型捕获函数但是当我尝试通过param()调用它时崩溃(使用Apple LLVM版本9.0.0(clang-900.0.38),x86_64-apple-darwin17 3.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);
}
Run Code Online (Sandbox Code Playgroud)

紧急

但根据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)
Run Code Online (Sandbox Code Playgroud)

所以我希望param是一个引用函数类型并由它调用.怎么了?

更新:看起来这是一个Clang优化器错误!FIX:在调用之前评估param的值 - 修复情况!

std::cout << param << " - " << (*param)(3,5);
Run Code Online (Sandbox Code Playgroud)

bar*_*ney 0

这似乎是一个 Clang 优化器错误!修复:在调用参数之前评估参数的值 - 修复了这种情况!

std::cout << param << " - " << (*param)(3,5);
Run Code Online (Sandbox Code Playgroud)