为什么函数指针的强制转换不能像对待基元类型那样工作


int* b = new int(40);
int c = *(int *)b;

上面的模型运行良好。

但类似的强制转换对函数指针不起作用

void abc(int a){
cout<<a<<endl;
}
std::function<void(int)> callback = *(std::function<void(int)>*)abc; // this cast is not working

上面的代码有什么错误?

您将b强制转换为它已经具有的相同类型。这将导致静态强制转换,而不会更改值。b的类型为int*,并强制转换为int*

您将abc强制转换为完全不同的类型。由于目标类型是不相关的,这导致了重新解释强制转换,并且通过重新解释的指针访问指向的对象(这是一个问题,因为它指向的是函数而不是对象(会导致未定义的行为。abc的类型是作为函数类型的void(int),并且它隐式衰减为作为指向函数类型的指针的void(*)(int)。您将其强制转换为std::function<void(int)>*,它是指向对象类型的指针,其中对象类型是从类模板std::function实例化的类类型。

上面的代码有什么问题?

  • 使用C风格的强制转换是错误的。不要这么做
  • 重新解释将指针强制转换为不相关的类型是错误的。std::function<...>*不是指向函数的指针。std::function不是函数。它是函数包装器的类模板

std::function<void(int)>不是函数。它是一个具有operator()的类。它有一个构造函数,您需要调用它来创建该类的实例。例如:

std::function<void(int)> callback = abc;

另一方面,这里:

int* b = new int(40);
int c = *(int *)b;

CCD_ 15确实创建了一个CCD_ 16对象,而CCD_。强制转换(int*)b没有任何作用,因为b已经是一个int*,您可以取消引用它来将int的值分配给c


我尽量保持简单,为了更准确地解释代码中实际发生的事情,我建议您参考以下答案:https://stackoverflow.com/a/70166958/4117728.

相关内容

  • 没有找到相关文章

最新更新