【问题标题】:Why is it not allowed to assign const char * to const variable?为什么不允许将 const char * 分配给 const 变量?
【发布时间】:2021-11-01 17:55:48
【问题描述】:
char* name;
const char* _name = "something";
name = _name; // conversion from const char * is not allowed

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

为什么 C++ 禁止 name 指向一些文字 _name 指向?

【问题讨论】:

  • afaik name = _name 从来都没有问题,但 char * _name = "something"; 已被弃用,因为它在 constness 上撒谎
  • 它们是不同的类型。如果你有char*,你可以修改它所指向的内容。如果name = _name; 被允许,name[0] = 'A'; 也将被允许,这将修改const 数组。
  • C最初允许char * _name = "something";,因为const还没有被发明出来
  • @Caleth 是的,如果我没记错的话,它仍然允许这样做。
  • 请解释为什么您认为允许它对任何人都有好处。

标签: c++ char constants


【解决方案1】:

因为name 是非常量,这意味着您可以更改值。

例如:

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

但是_name 被声明为const,这意味着您不能更改它。

您不能获取固定的常量数据并将其分配给不同的变量;这就是说“如果你改变它就可以了”。

【讨论】:

  • 从技术上讲,_name 没有声明为 const,您可以更改它。你不能改变的是_name指向的数组。
【解决方案2】:

这个:

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

从来没有被允许,因为,草率地说,它会将 const 的东西变成可以修改的东西。 _name 是指向 const char 的指针,但 name 是指向非常量 char 的指针。

过去允许的是

char* _name = "something";

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

【讨论】:

    【解决方案3】:

    我知道它在 c++ 中已被弃用

    它没有被“弃用”(也从未被弃用)。根本不允许。该程序格式不正确。请参阅 463035818_is_not_a_number 的 answer 了解过去已弃用且有点相似的内容。

    为什么不允许

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

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

    指向 const 的指针可能指向一个 const 对象,例如在示例中所做的那样。由于无法直接通过它修改指向的对象,这很好。但是,您可以通过指向非常量的指针直接修改对象。因此,用指向非 const 的指针指向 const 对象是不安全的。由于指向 const 的指针可能指向 const 对象,因此将指向 const 的指针转换为指向非 const 的指针是不安全的。因此,这种转换不是隐式的,这很好。

    【讨论】:

      【解决方案4】:

      如果很容易规避,那么使用const 有什么意义?反问。

      const 的存在是为了防止你犯错,这是不允许的。

      但是,这是允许的:

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

      虽然不推荐。仍然不允许通过非常量指针修改字符串文字。

      【讨论】:

        【解决方案5】:

        const 在此上下文中不适用于指针,而是适用于指针指向的值。

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

        char* 是一个(非常量)指针,指向非常量 char

        这些是不同的类型。非 const 版本允许修改指向的值,而 const 版本则不允许。

        C++ 类型安全规则确保 const 正确性。非 const 类型可以隐式转换为 const 类型,但反之则不行。剥离 const 需要显式转换(const cast,这通常是代码异味和/或错误)。

        如果你想自己有一个 const 指针,你应该使用char * const。那是一个const 指向非常量char 的指针。但请注意,像"something" 这样的字符串文字始终是const,它不能被修改。

        【讨论】:

          猜你喜欢
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多