为什么不允许将 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 是指向非常量 char.

的指针

过去允许的是

char* _name = "something";

它在 C++ 中一直被弃用,编译器通常会针对它发出警告。它已在 C++11 中被删除(参见 cppreference/string_literal),因为它在常量方面撒谎。即使 _name 声明为 char*,您也不能修改它指向的字符串。它被允许的原因是与最初没有 const 的 C 的兼容性。它已经出错了,因为试图通过 _name 修改字符串总是错误的。 "something" 的类型确实是 const char[10].

I know it is deprecated in c++

它没有“弃用”(而且从来没有)。根本不允许。程序格式错误。请参阅 463035818_is_not_a_number 的 了解曾经被弃用但有点相似的内容。

Why is it not allowed

由于“const 安全”(或“const 正确性”)是“类型安全”的子概念,指向 const 的指针不能隐式转换为指向非 const 的指针。在非常简短和抽象的描述中:语言的类型系统试图防止程序员犯明显的错误。

如果一个对象是const,那么它就不能被修改。尝试修改 const 对象会导致未定义行为 (UB)。 UB 非常非常糟糕。您绝不能修改 const 对象。

指向 const 的指针可能指向一个 const 对象,就像它在示例中所做的那样。由于无法直接通过它修改指向的对象,所以这很好。但是,您可以通过指向非常量的指针直接修改对象。因此,用指向非 const 的指针指向 const 对象是不安全的。由于指向 const 的指针可能指向 const 对象,因此将指向 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 cast,这通常是代码味道 and/or 错误)。

如果你想拥有一个 const 指针本身,你应该使用 char * const。这是一个指向非常量 charconst 指针。但请注意,像 "something" 这样的字符串文字总是 const,无法修改。