为什么不strlen(..)期望const char*const str而不是const char*

bra*_*ter 2 c++ string

我正在读这个:const char*const与const char*?

string.h,strlen定义为:

size_t strlen ( const char * str );
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,strlen需要一个指向const的char的指针.不应该是:

size_t strlen ( const char* const str );
Run Code Online (Sandbox Code Playgroud)

这样可以确保strlen不能修改指针指向不同的指针吗?

或者,是这样的情况:

由于str指针将通过值传递给strlen,因此函数中对此指针的任何更改都不会更改源指针,因此它没关系..

??

AnT*_*AnT 11

如果你真的读过那个讨论,你应该明白第二个const对函数的外部行为没有影响.对于你来说,strlen无论是用声明const char *还是const char *const参数声明它都没有任何区别.当你正确地指出,任何修改strlen可能会做的指针只影响内部,本地副本的指针内strlen.strlen无论参数是否以秒声明,您传递给的参数指针都将保持不变const.(你的参数指针甚至不必是左值.)

第二const只会对函数内部的局部参数变量的内部行为的效果,防止作者strlen从修改局部变量.他们是否想要以这种方式限制自己是非正式地说,他们自己的事业.它不strlen以任何方式涉及用户.

实际上,由于顶级const限定符对函数类型没有影响,因此通常可以使用参数声明函数,const char *然后使用参数定义const char *const.编译器(链接器)仍将这些声明视为"匹配".这意味着如果库作者如此需要,他们实际上可以strlenconst char *const参数定义.他们根本就没有告诉你这个,因为这实际上是一个实现细节,或者strlen你不需要知道的东西.