我們有一個常用的類層次結構:爲什麼函數指針會破壞替代性,而std :: function不會呢?
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如何避免第一個問題?
其編譯器和版本沒有的 「作品」 適用於 –
@ Cheersandhth. - 阿爾夫G ++ 4.7.2的MinGW – milleniumbug
HM,thinko,SRY –