【发布时间】:2021-03-23 01:40:43
【问题描述】:
[注意:我看到另一个问题询问同一本书中的同一部分,但出于不同的原因]
通读 C++ 入门书并正在阅读“顶级常量”部分。这里写道:
当我们复制一个对象时,顶层和低层的区别很重要。 当我们复制一个对象时,顶级常量被忽略
当我们复制一个对象时, 两个对象必须具有相同的低级 const 限定...
这是我理解的,但我继续操作并多次操作书中给出的示例,以进一步理解不同场景。下面的代码就是这样一种场景:
int i = 5;
int *p = &i;
const int *const ptr = p;
p = ptr;
在我运行程序之前,我已经假设第 4 行是合法的。然而,智能感知反而给我抛出了这个错误:
“const int *”类型的值不能分配给“int *”类型的实体
现在我已经完成了其他操作,例如 *p = *ptr(合法)、ptr = p(显然是非法的)并将对象 i 更改为 const(这将要求我更改 p并满足复制对象必须具有相同的低级 const 的条件)。在所有情况下,我都了解原因。
但不适用于这种情况。有人可以解释为什么这是非法的吗?
【问题讨论】:
-
ptr可能指向const int。您不希望非常量int*指向const int。 -
经典的例子是这样的:
char * p = "hello world"(以前是法律代码),然后是p[0] = 'y';。字符串文字“hello world”可能在只读存储中,使用p[0] = 'y';写入不可写存储是个坏主意。 -
@user4581301:
char * p = "hello world";在 C 中仍然是合法的,如果你修改了chars,它只是未定义的行为,所以它必须被视为“有效的const”。 C++ 制作的文字实际上至少官方有const char数据。