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

Why doesn't C++ enforce const on pointer data?

本文关键字:强制执行 const 数据 指针 C++ 为什么      更新时间:2023-10-16

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

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

class ConstTest
{
    public:
    ConstTest(int *p): a(p) {}
    void constMod() const {
        ++(*a);
    }
    int *a;
};

我在 Linux 上使用 g++。

constMod() 中,a的声明被视为:

int *const a;

这意味着指针有一个常量值,而不是它指向的值。听起来您希望将其视为:

const int *a;

这是不同的。

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

这只是

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

在上述情况下,常量是指针本身。您不得执行++a;。但是,它不会阻止您修改指向的数据。

我相信,

因为在这里您正在尝试更改数据成员指向的值。如果您尝试修改数据成员,那将是错误的。

这意味着,如果您指向其他内容而不是更改值,则会出现错误

const成员函数将不允许您修改其成员。

在您的示例中,您有一个指向 int 的指针。

const 方法中,您正在修改它指向的值,而不是指针本身。

尝试给予,++a,这实际上会修改指针值,并且在您的const方法中是不允许的。

考虑

const T immutable_object0;
const T immutable_object1;
const T* mutable_view = ...a condition... ? &immutable_object0 : &immutable_object1;
// then later you reseat
mutable_view = ...another condition... ? &immutable_object0 : &immutable_object1;

const int immutable_data[120]
const int* mutable_view = immutable_data;
for(const int* end = immutable_data + 120; mutable_view != end; ++mutable_view) {
  // can't modify *mutable_view
}

这是因为指针并不总是拥有所有权。在某些情况下,指针是指向对象的视图(第一个示例),或者是原始数组的迭代器(第二个示例)。对于这些情况,仅仅因为指向的数据是不可变的(或被视为不可变的)而限制指针上可用的操作是没有意义的。

第一个示例有点做作,但它的有效版本是当您使用指针成员来实现对象关联并且您不希望引用成员的麻烦时。有时指向的类型恰好是const .