[英]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.