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"的内容(除非代码使用显式类型转换(。
从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
去掉指针并无论如何修改它!(。但这并不是重载的重点,重点是让意外的错误更难犯。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用指向成员的指针将成员函数作为参数传递
- 如何将参数传递给正在使用模板的类
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将部分流作为参数传递
- 我正在开发服务器,ip作为参数传递不起作用
- 将成员函数指针作为参数传递给模板方法
- 如何在C++中将迭代器作为函数参数传递
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 数组在函数中作为参数传递并被访问,那么为什么从函数返回后数组的值会被修改呢?
- 对象在C++中作为参数传递给函数时被修改
- 如何确保作为模板参数传递的函数类型不会修改参数
- c++将非模板特征向量作为函数参数传递,并在函数中对其进行修改
- 如何修改数组指针并将其作为参数传递给需要数组作为参数的函数
- 返回值或修改引用传递的参数是否更快?
- 我可以修改作为参数传递的指针的目标吗?
- C++中的strchr如何保证其调用者不会修改作为参数传递的字符串