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

时间:2015-07-02 18:09:45

标签: c++ c const const-correctness

在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) 保证其调用者不会修改其参数。

2 个答案:

答案 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远离指针并修改无论如何!)。但这不是重载的重点,重点是让意外错误更难以制作。