为具有或不具有限定符的指针指定指针

eme*_*esx 11 c c++ pointers c99

虽然这编译:

char* p2c;
const char* p2cc = p2c; //fine
Run Code Online (Sandbox Code Playgroud)

因为lhs指向类型具有rhs指向类型的所有限定符,所以不会:

char** p2p2c;
const char** p2p2cc = p2p2c; //fail
Run Code Online (Sandbox Code Playgroud)

但这样做:

const char * const * p2cp2cc = p2p2c; //fine
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

Dav*_*eas 7

这不起作用:

char** p2p2c;
const char** p2p2cc = p2p2c; //fail
Run Code Online (Sandbox Code Playgroud)

如果允许,你将被允许打破const正确性:

const int k = 10;
int *p;
int **pp = &p;
int const **kpp = pp;     // Should this be allowed, if so:
*kpp = &k;                // fine, kpp promises not to change it
                          // yet this does p = &k;
                          // p made no such promise! this is a hidden const_cast!
*p = 5;
Run Code Online (Sandbox Code Playgroud)

如果转让是允许的,你会这样设置非const指针(中间)指一个恒定值,从而可能导致在非显而易见的未定义行为看路.通过禁止该操作,类型系统更安全.

但这样做:

const char * const * p2cp2cc = p2p2c; //fine
Run Code Online (Sandbox Code Playgroud)

这很好,因为中间指针是固定的,所以不可能重置中间指针来引用const对象并破坏const-correctness

  • 同样,从`char**`到`char const*const*`的隐式转换仅在C++中可用,但在C中不可用. (3认同)