簡體   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