为什么C++不对指针数据强制执行 const?
Why doesn't C++ enforce const on pointer data?
可能的重复项:
为什么 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
.
- 如何对模板类型强制执行常量
- C++:我可以在模板参数包中强制执行至少1个agment吗
- 编译器未强制执行返回协定
- 如何在 Linux 上强制执行矢量下标超出范围的调试断言
- 如何使用C++模板强制执行正式协议?
- 为什么在与静态库链接时强制执行 order(例如 source.cxx -lstatic)
- 将lambdas转换为std ::函数时,执行const-correctness
- 当函数在 GCC 中没有任何返回时,如何强制执行错误?
- 强制执行执行顺序
- 替换decorator模式以强制执行创建顺序
- 我可以强制执行标量类型通过 int{} 初始化为零吗?
- 如何在C++17中强制执行模板和模板模板参数之间的约束
- 如何在Boost::DateTime中强制执行严格的解析
- 强制执行C++语句顺序
- makefile是否可以在C++中强制执行依赖项限制
- 强制执行此模板的更好方法
- 为非专用模板实例化强制执行编译错误
- 在编译时强制执行静态存储
- 在代码(C/C++)中强制执行自定义规则
- 为什么C++不对指针数据强制执行 const?