我们有一个通常的类层次结构:
class B
{
public:
int x;
B() : x(0) {}
virtual ~B() {}
};
class D : public B
{
public:
int y;
D() : y(0) {}
};
还有一个接受一个参数的函数 - 对基类对象的引用。
void b_set(B& b)
{
b.x = 5;
}
然后,我想创建类型的函数指针void (D&)
并存储b_set
在其中。这应该是有效的操作,因为合法传递给函数指针调用的所有对象也必须是 B 类型。但这是不允许的。
typedef void (*fp_d_mutator)(D&);
void fp_test(D& obj)
{
fp_d_mutator fun = b_set; //invalid conversion from 'void (*)(B&)' to 'fp_d_mutator {aka void (*)(D&)}
fun(obj);
}
#include <functional>
typedef std::function<void (D&)> stdfun_d_mutator;
void stdfun_test(D& obj)
{
stdfun_d_mutator fun = b_set; //works
fun(obj);
}
所以...
- 那无效转换如何?
- 为什么无效转换?
- 如果允许这样做会破坏什么?
- std::function 首先是如何避免这个问题的?