繁体   English   中英

将对象复制到另一个对象时,为什么 C++ 需要对两个对象进行低级 const 限定?

[英]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++ 有这样的规则时,它们背后是有原因的。 我发现理解它们是理解规则的基础,因此更容易记住(这就像理解一个数学概念而不是记住公式)。 然而,我发现没有符合这里谜题的逻辑规则。

作为总结,我的问题是:

  1. 为什么在复制对象时会忽略顶级const限定? (书中也有解释原因的部分,但我似乎无法理解)

复制和对象不会改变复制的对象。 因此,复制自或复制到的对象是否为const并不重要

  1. 复制对象时从不忽略低级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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM