c – 为什么成员函数temporaries不绑定到正确的类型?
假设我们有以下基类和派生类:
#include <string> #include <iostream> class Car { public: void Drive() { std::cout << "Baby,can I drive your car?" << std::endl; } }; class Porsche : public Car { }; ..还有以下模板功能: template <typename T,typename V> void Function(void (T::*m1)(void),void (V::*m2)(void)) { std::cout << (m1 == m2) << std::endl; } 为什么使用GCC编译: int main(int argc,char** argv) { void (Porsche::*ptr)(void) = &Porsche::Drive; Function(ptr,ptr); return 0; } ……但不是吗? int main(int argc,char** argv) { void (Porsche::*ptr)(void) = &Porsche::Drive; Function(&Porsche::Drive,ptr); return 0; } 解决方法int main(int argc,ptr); return 0; } ptr的类型为void(Porsche :: *)(),但& Porsche :: Drive的类型为void(Car :: *)()(因为该成员在Car中找到,而不是在Porsche中).因此,调用的函数将这两个成员指针与这些类型进行比较,标准说
4.11描述了从void(Base :: *)()到void(Derived :: *)()的隐式标准转换.因此,比较会找到常见类型void(Porsche :: *)().对于Porsche类型的对象,两个成员指针都将引用相同的函数(即Car :: Drive) – 因此比较将产生true. comeau web compiler遵循此解释并编译您的代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |