如何声明不可修改的C++成员函数指针?求C++11前实现方式
在C++11之前声明常量成员函数指针
要让你的成员函数指针本身成为常量(即不能被重新赋值),关键是把const放在正确的位置——也就是成员函数指针声明中*和变量名之间。
对于你的foo结构体:
struct foo { void func1(); void func2(); };
正确的常量成员函数指针声明应该是这样:
void (foo::* const bar)() = &foo::func1;
这样声明后,如果你尝试执行bar = &foo::func2;,编译器就会报错,阻止你修改bar的值,完全符合你的需求。
为什么要这么写?
成员函数指针的语法本身比较容易混淆,这里要区分两种const的作用:
void (foo::*)() const:这是指向const成员函数的指针,指针可以指向那些不会修改对象的成员函数,和你要的“指针本身不可修改”不是一回事。void (foo::* const)():这才是常量成员函数指针,指针变量本身是const的,一旦完成初始化就不能再指向其他成员函数。
而C++11的const auto bar = &foo::func1;之所以能生效,是因为auto自动推导了成员函数指针的类型,再加上const修饰了变量本身,和上面手动写的声明效果完全一致。
内容的提问来源于stack exchange,提问作者Jonathan Mee
相关产品推荐
相关产品推荐

