【问题标题】:C++ reference to function crashes in a callC++ 对函数的引用在调用中崩溃
【发布时间】:2017-11-18 06:29:37
【问题描述】:

我使用模板化引用通过引用函数类型来捕获函数,但是当我尝试通过 param() 调用时它崩溃(使用 Apple LLVM 版本 9.0.0 (clang-900.0.38),x86_64-苹果-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:在调用参数之前评估参数的值 - 修复了这种情况!

std::cout << param << " - " << (*param)(3,5);

【问题讨论】:

  • 在这里使用 Clang 3.8 在 Linux 上没问题。你的编译器一定会产生错误的代码。
  • typeid 在不包括 typeinfo 的情况下是否工作?
  • Android AArch64,GCC 7.2.0,不可复制。
  • @iBug 确实如此,内存中的结构并填充了有效数据。类型为 FiiiE(函数取 int, int ..)
  • 我使用的是 GCC 4.8.2,它可以工作。也在视觉工作室

标签: c++ function templates reference


【解决方案1】:

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

std::cout << param << " - " << (*param)(3,5);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多