繁体   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