我想知道为什么static_cast
fromint (*)(const int&)
到typeint (*)(int&)
是非法的。如果我有一个函数指针,从技术上讲它允许接受一个,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);
}
[...]标准中有更深层的原因说明[...]
这些问题通常无法回答。也许没有人认为这是值得研究的事情。通常,C ++对协方差和逆方差的支持有限。还有许多其他可能的安全转换,而不仅仅是限定引用。
例如,类似的函数指针Animal*(*)(Dog*)
可以从Animal*(*)(Animal*)
和初始化Dog*(*)(Dog*)
。但是今天,两种转换都不被支持。
因此,真正的答案可能是:编写建议。
但是,在这种情况下,我们仍然可以通过明显未被重视的规则来实现所需的行为:几乎总是Lambda。我们知道,按名称,我们要使用的函数和没有捕获的lambda(不需要)可以转换为函数指针:
int (*f)(int&) = [](int& i) { return g(i); };
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句