在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安全”,但我无法理解第二个声明如何 char * strchr(char * str,int character) 保证其调用者不会修改其参数。
答案 0 :(得分:2)
它没有做出这样的承诺。恰恰相反,它为调用者提供了一种通过返回指针修改字符串的方法。这就是为什么只能使用非const指针调用此版本。
答案 1 :(得分:1)
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
远离指针并修改无论如何!)。但这不是重载的重点,重点是让意外错误更难以制作。