[英]Why does C in contrast to C++ ban adding const-qualification to both levels of a pointer-to-pointer?
[英]Why does C++ require low-level const qualification on both objects when copying an object to another?
当我看到有关顶级和低级const
的这一部分时,我正在阅读C++-Primer (由 Josée Lajoie 和 Stanley B. Lippman 撰写)。 在一段中,它说复制对象时,顶级const
被忽略。
例如。
const int i = 24;
int i2 = i;
当复制到i2时, i 中的顶级const
限定被忽略。
然而,它也指出
另一方面,低级
const
永远不会被忽略。 当我们复制一个对象时,两个对象必须具有相同的低级const
限定,或者两个对象的类型之间必须进行转换。 在一般情况下,我们可以转换为非const
,以const
而不是周围的其他方法。
现在,通常当 C++ 有这样的规则时,它们背后是有原因的。 我发现理解它们是理解规则的基础,因此更容易记住(这就像理解一个数学概念而不是记住公式)。 然而,我发现没有符合这里谜题的逻辑规则。
作为总结,我的问题是:
const
限定? (书中也有解释原因的部分,但我似乎无法理解)复制和对象不会改变复制的对象。 因此,复制自或复制到的对象是否为
const
并不重要
const
背后的原因是什么? (两个对象都需要低级const
限定)顶级情况:您制作了 const 对象的副本,因此您的副本是否为 const 并不重要,因为(假设 const 类型正确)您无法通过副本修改原始对象。
低级情况:您将句柄复制到另一个对象。 原始句柄不允许修改它所引用的对象。 允许忽略低级 const 意味着您可以获得一个句柄,允许您修改引用的对象,从而破坏 const 的正确性。
它会允许这种疯狂:
// should not modify n, right?
void foo(const int& n)
{
int& mutable_n = n;
mutable_n = 42;
}
...
int n = 0;
foo(n); // should not modify n, right?
std::cout << n << '\n'; // prints 42, wat??
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.