一位同事询问了一些最初有模板的代码.
我已经删除了模板,但核心问题仍然是:为什么编译好了?
#include <iostream>
class X
{
public:
void foo() { std::cout << "Here\n"; }
};
typedef void (X::*XFUNC)() ;
class CX
{
public:
explicit CX(X& t, XFUNC xF) : object(t), F(xF) {}
void execute() const { (object.*F)(); }
private:
X& object;
XFUNC F;
};
int main(int argc, char* argv[])
{
X x;
const CX cx(x,&X::foo);
cx.execute();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
鉴于CX是一个const对象,其成员函数execute是const,因此在CX :: execute中执行this指针是const.
但我可以通过成员函数指针调用非const成员函数.
成员函数指针是世界常量中的文档漏洞吗?
我们错过了什么(可能对他人来说很明显)?
Ash*_*ain 10
该const的内斯execute()只影响this类的指针.它使类型this一const T*,而不是只T*.这不是一个"深度"常量 - 它只意味着成员本身不能被改变,但他们指向或参考的任何东西仍然可以.您的object成员已无法更改,因为无法重新定位引用以指向其他任何内容.同样,你不改变的F成员,只是取消引用它作为一个成员函数指针.所以这是允许的,好的.
您创建CX const实例的事实不会改变任何事情:再次,这指的是不允许修改的直接成员,但是他们指向的任何东西仍然可以.您仍然可以在const对象上调用const成员函数,因此不会更改.
为了显示:
class MyClass
{
public:
/* ... */
int* p;
void f() const
{
// member p becomes: int* const p
*p = 5; // not changing p itself, only the thing it points to - allowed
p = NULL; // changing content of p in const function - not allowed
}
};
Run Code Online (Sandbox Code Playgroud)
在此上下文中object是对a的引用X,而不是对constX的引用.所述const限定词将被施加到所述构件(即参考,但引用不能const),而不是被引用的对象.
如果将类定义更改为不使用引用:
// ...
private:
X object;
// ...
Run Code Online (Sandbox Code Playgroud)
你得到了你所期待的错误.
| 归档时间: |
|
| 查看次数: |
2885 次 |
| 最近记录: |