为什么C++不对指针数据强制执行const?

Mat*_*ith 13 c++ pointers const

可能重复:
为什么const限定符不能处理const对象上的指针成员?

请考虑以下具有指针成员的类int *a.constMod即使修改指针数据,编译器也允许使用const方法.为什么编译器不在const方法的上下文中使指针数据为const?如果a只是一个int,我们将不允许在const方法中修改它.

class ConstTest
{
    public:

    ConstTest(int *p): a(p) {}

    void constMod() const {
        ++(*a);
    }

    int *a;
};
Run Code Online (Sandbox Code Playgroud)

我在linux上使用g ++.

Gre*_*ill 13

在内部constMod(),声明a被视为:

int *const a;
Run Code Online (Sandbox Code Playgroud)

这意味着指针具有常量值,而不是它指向的值.听起来你希望它被视为:

const int *a;
Run Code Online (Sandbox Code Playgroud)

这是不同的.

  • @Matt:要扩展GMan的类比,考虑他的整数是否是数组的索引,但数组不属于类[也许它被传递给const函数].你不希望`array [i] = 5`工作,即使`i`是const? (3认同)

Bru*_*uce 7

指针本身不会被修改,只会指向数据.从人类的角度来看,即使听起来很奇怪,但从编译器的角度来看,类的成员都没有被改变.


Ton*_*roy 4

这只是一个所有权问题......编译器无法知道所指向的对象在逻辑上是否是该对象的一部分,因此留给程序员来监管此类问题。 const成员可以执行有副作用的操作,只要它们不修改自己的表观值。std::cout::operator<<()这与让他们调用 say或其他非常量函数没有什么不同......