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

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

本文关键字:修改 参数传递 字符串 strchr 中的 何保证 调用者 C++      更新时间:2023-10-16

在C中,strchr的定义如下

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

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

从web中收集到的问题是,当这个定义返回指针时,它会强制转换"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++版本是常量正确的,而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去掉指针并无论如何修改它!(。但这并不是重载的重点,重点是让意外的错误更难犯。