为什么我可以从const方法调用非const成员函数指针?

sdg*_*sdg 6 c++

一位同事询问了一些最初有模板的代码.

我已经删除了模板,但核心问题仍然是:为什么编译好了?

#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类的指针.它使类型thisconst 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)


Geo*_*che 8

在此上下文中object是对a的引用X,而不是对constX引用.所述const限定词将被施加到所述构件(即参考,但引用不能const),而不是被引用的对象.

如果将类定义更改为不使用引用:

// ...
private:
    X object;
// ...
Run Code Online (Sandbox Code Playgroud)

你得到了你所期待的错误.

  • 成员是引用,而不是引用的对象. (3认同)