我想知道为什么从int(*)(const int&)到static(*)(int&)的static_cast是非法的.如果我有一个功能指针,技术上允许接受int&但是想要为它分配一个自愿放弃修改指向值的权限的函数,它不应该像原则上可以作为函数的特殊情况一样吗?
换句话说,鉴于我可以通过一个任意的int&对于int(*)(const int&)函数,在标准中有更深层次的原因,为什么后者不能被认为是int(*)(int&)的特殊情况并分配给这样的变量?
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); };