簡體   English   中英

為什么不允許將 const char * 分配給 const 變量?

[英]Why is it not allowed to assign const char * to const variable?

char* name;
const char* _name = "something";
name = _name; // conversion from const char * is not allowed

我知道它在 c++ 中已被棄用,但我想知道為什么......

為什么 C++ 禁止name指向一些字面值_name指向?

因為name是非常量的,這意味着您可以更改值。

例如:

*name = 'S'; // Change from "something" to "Something"

但是_name被聲明為const ,這意味着您無法更改它。

您不能獲取固定的常量數據並將其分配給不同的變量; 這就是說“如果你改變它就可以了”。

這個:

name = _name; // conversion from const char * is not allowed

從來沒有被允許,因為,草率地說,它會將const的東西變成可以修改的東西。 _name是指向const char的指針,但name是指向 non-const char的指針。

過去允許的是

char* _name = "something";

它在 C++ 中總是被棄用,編譯器通常會為此發出警告。 它已在 C++11 中刪除(請參閱cppreference/string_literal ),因為它在 constness 上撒謊。 即使_name被聲明為char* ,您也不能修改它指向的字符串。 允許它的原因是與最初沒有const的 C 的兼容性。 出錯了,因為嘗試通過_name修改字符串總是錯誤的。 "something"的類型確實是const char[10]

我知道它在 c++ 中已棄用

它沒有被“棄用”(從來沒有)。 根本不允許。 該程序格式不正確。 請參閱 463035818_is_not_a_number 的答案,了解曾經被棄用且有點相似的內容。

為什么不允許

由於“const 安全”(或“const 正確性”)是“類型安全”的子概念,指向 const 的指針不能隱式轉換為指向非 const 的指針。 在非常簡短和抽象的描述中:語言的類型系統試圖防止程序員犯明顯的錯誤。

如果 object 為 const,則無法修改。 嘗試修改 const object 會導致未定義的行為 (UB)。 UB非常非常糟糕。 您絕不能修改 const object。

指向 const 的指針可能指向 const object,例如在示例中。 由於無法直接通過它修改指向的 object,這很好。 但是,您可以通過指向非常量的指針直接修改對象。 因此,用指向非 const 的指針指向 const object 是不安全的。 由於指向 const 的指針可能指向 const object,因此將指向 const 的指針轉換為指向非 const 的指針是不安全的。 因此,這種轉換不是隱式的,這很好。

如果它很容易規避,那么使用const有什么意義呢? 修辭問題。

不允許存在const以防止您犯錯誤的簡單事實。

但是,這是允許的:

const char *s = "hello";
char *t = (char*) s;

雖然不會推薦它。 仍然不允許通過非常量指針修改字符串文字。

在這種情況下, const不適用於指針,而是適用於指針指向的值。

const char*是指向const char的(非常量)指針。

char*是指向非常量char的(非常量)指針。

這些是不同的類型。 非 const 版本允許修改指向的值,而 const 版本則不允許。

C++ 類型的安全規則確保 const 正確性。 非 const 類型可以隱式轉換為 const 類型,但反之則不行。 剝離const需要顯式強制轉換( const cast ,這通常是代碼異味和/或錯誤)。

如果您打算自己擁有一個 const 指針,則應使用char * const 這是一個指向非 const charconst指針。 但請注意,像"something"這樣的字符串文字始終是const ,它不能被修改。

讓我們假設name = _name是允許的。

由於它們都是指針,因此它們都將指向相同的值。

這意味着如果我們執行name[0] ='B'也意味着_name[0] = 'B' (即 const),這就是不允許這樣做的原因。

但是,這是允許的

const char cc = 'a';
char c = 'b';

 c = cc; 

ccc不是指針,因此之后更改c不會更改cc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM