c – 限制函数指针的转换

前端之家收集整理的这篇文章主要介绍了c – 限制函数指针的转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道为什么从int(*)(const int&)到static(*)(int&)的static_cast是非法的.如果我有一个功能指针,技术上允许接受int&但是想要为它分配一个自愿放弃修改指向值的权限的函数,它不应该像原则上可以作为函数的特殊情况一样吗?

换句话说,鉴于我可以通过一个任意的int&对于int(*)(const int&)函数,在标准中有更深层次的原因,为什么后者不能被认为是int(*)(int&)的特殊情况并分配给这样的变量?

M(!W)E

int g(const int& q) {
  return q;
}

int main() {
  int (*f)(int&) = static_cast<int(*)(int&)>(g); // breaks
  int x = 1;
  return f(x);
}

解决方法

[…] is there a deeper reason in the standard why […]

这些问题通常无法回答.也许没有人认为这是值得研究的事情. C通常对协方差和逆变的支持有限.还有许多其他可能的安全转换,而不仅仅是对引用进行限定.

例如,像Animal *(*)(Dog *)这样的函数指针可以从Animal *(*)(Animal *)和Dog *(*)(Dog *)中初始化.但今天,两种转换都不受支持.

所以真正的答案可能是:write a proposal.

然而,在这种情况下,我们仍然可以通过一个明显被低估的规则来实现所期望的行为:几乎总是Lambda.我们知道,我们想要使用的函数,没有捕获的lambdas(我们不需要)可以转换为函数指针:

int (*f)(int&) = [](int& i) { return g(i); };
原文链接:https://www.f2er.com/c/119011.html

猜你在找的C&C++相关文章