为什么不允许将 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
。这是一个指向非常量 char
的 const
指针。但请注意,像 "something"
这样的字符串文字总是 const
,无法修改。
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
。这是一个指向非常量 char
的 const
指针。但请注意,像 "something"
这样的字符串文字总是 const
,无法修改。