为什么我们不对常量字符串使用 const char* const?

Why don't we use const char* const for constant strings?

在 C++ 中存储常量字符串的标准方法是使用 const char*。 为了精确和正确,我们为什么不写const char* const

这只是因为人们懒得写额外的const,还是因为它确实有一些缺点?

编辑: 我想我应该更清楚,我不需要解释 const 在不同位置的作用,我知道很多已经。我想知道的是为什么约定要写 const char* 即使对于您知道永远不会更改指针的变量也是如此。仅仅是品味和风格的问题吗?

类型 int 的变量很容易被意外修改,方法是将其传递给采用 int& 的函数。这在调用站点是“不可见的”,因为调用一个采用 int& 的函数看起来与调用一个采用 intconst int& 的函数相同。为了防止这种情况,我们尽可能使变量 const

对于class类型的变量,不仅会出现上述问题,还可能调用非const的成员函数不小心修改了,看起来是一样的作为对 const 成员函数的调用。因此,再次标记变量 const 通常有助于在编译时捕获此类错误。

使用 const char* 变量,你很少会通过将它们传递给采用 const char*& 的函数来意外修改它们(因为这样的函数很少被声明),当然,指针没有成员函数。因此,使用 const 保护 pointed-to 数据足以防止大多数意外修改。当然,某处仍然可能有一个更改指针变量值的赋值,但通常您可以在代码审查期间发现这一点。如果你无论如何都想写 const char* const,我认为没有理由不这样做,但有些人会认为这是不必要的混乱。

const适用于它左边的东西,除非那里什么都没有,否则它适用于它右边的东西。

const char *(也可以写成char const *)中,constchar上,而不在*上。因此,这声明了一个 mutable 指向 immutable const char 数据的指针。不能通过指针修改数据,但是指针本身可以自由改变指向任意const char内存,eg:

const char *ptr = "string 1"; // OK
*ptr = 'S'; // illegal
ptr = "string 2"; // OK

const char * const中(也可以写成char const * const),在char上有一个const,还有一个const* 上。因此,这声明了一个指向 immutable const char 数据的 immutable const 指针。不能通过指针修改数据,指针本身一旦初始化就不能改变,eg:

const char * const ptr = "string 1"; // OK
*ptr = 'S'; // illegal
ptr = "string 2"; // illegal

为了完整起见,我们也考虑一下 char * constconst* 上,而不在 char 上。因此,这声明了一个 immutable const 指向 mutable char 数据的指针。通过指针可以自由修改数据,但是指针本身一旦初始化就不能再改变,eg:

char buffer1[] = "string 1", buffer2[] = "string 2";
char * const ptr = buffer1; // OK
*ptr = 'S'; // OK
ptr = buffer2; // illegal

What I wanted to know is why the convention is to write const char* even for variables where you know you are never going to change the pointer. Is it just a matter of taste and style?

基本上,是的。如果您知道您不会更改指针,那么没有什么可以阻止您编写 const char * const。它不是要求,所以很容易省略指针本身的const。更重要的是指针指向的数据类型。