C ++中的strchr如何保证其调用者不会修改作为参数传递的字符串

how does strchr in C++ guarantee its caller that it will not modify the string passed as parameter

C中strchr的定义如下

char * strchr(const char *s, int c);

此声明向用户保证 strchr 不会修改 's' 的内容(除非代码使用显式类型转换)。

从网络上收集到的问题是,此定义在 returns 指针时转换 "const" 属性,因此在 'C++' 中这不是 "const correct"。

C++的解决方案好像是函数重载

const char * strchr ( const char * str, int character );
      char * strchr (       char * str, int character );

虽然这是 "const safe",但我无法理解第二个声明的方式 char * strchr (char * str, int 字符) 向它的调用者保证它不会修改它的参数。

它没有做出这样的承诺。恰恰相反,它为其调用者提供了一种通过返回的指针修改字符串的方法。这就是为什么这个版本只能用非常量指针调用的原因。

C++ 版本是 const-correct 而 C 版本不是,因为使用 C 你可能会不小心这样写

const char str[] = "Hello world";
*strchr(str, 'o') = 'O'; // undefined behaviour

或这个

*strchr("Hello world", 'o') = 'O'; // undefined behaviour

虽然 C++ 版本会在编译时失败

const char str[] = "Hello world";
*strchr(str, 'o') = 'O'; // error: assignment of read-only location

如您所见,给定一个签名,您无法证明任意函数不会修改指向的数据(更糟糕的是,考虑一个函数可以 const_cast 离开指针并修改它!)。但这不是重载的重点,重点是让意外错误更难发生。