![](/img/trans.png)
[英]Assigning to a char * const * variable from a char * * variable - why is it allowed?
[英]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 char
的const
指針。 但請注意,像"something"
這樣的字符串文字始終是const
,它不能被修改。
讓我們假設name = _name是允許的。
由於它們都是指針,因此它們都將指向相同的值。
這意味着如果我們執行name[0] ='B'也意味着_name[0] = 'B' (即 const),這就是不允許這樣做的原因。
但是,這是允許的
const char cc = 'a';
char c = 'b';
c = cc;
cc和c不是指針,因此之后更改c不會更改cc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.