限制函数指针的转换

Vee

我想知道为什么static_castfromint (*)(const int&)到typeint (*)(int&)是非法的。如果我有一个函数指针,从技术上讲它允许接受一个,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);
}
巴里

[...]标准中有更深层的原因说明[...]

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

例如,类似的函数指针Animal*(*)(Dog*)可以从Animal*(*)(Animal*)初始化Dog*(*)(Dog*)但是今天,两种转换都不被支持。

因此,真正的答案可能是:编写建议


但是,在这种情况下,我们仍然可以通过明显未被重视的规则来实现所需的行为:几乎总是Lambda。我们知道,按名称,我们要使用的函数和没有捕获的lambda(不需要)可以转换为函数指针:

int (*f)(int&) = [](int& i) { return g(i); };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章