本文涉及对C和C++特性比较深入的探讨, 并不适合新手阅读, 仅仅希望解决问题的请跳转最后一节寻找解决方案。对于本文大部分内容, 需要读者至少清晰知道
int* const
和const int*
类型的区别, 并能读懂形如const int **const *const **
的多层const类型, 确保不会被绕晕, 对此概念不清淅的可以阅读该回答。
文章目录
g++编译通过的样例:
/*sample1*/
char p2;
const char p1 = p2;
/*sample2*/
char * p2;
const char* p1 = p2;
/*sample3*/
char p2;
const char& p1 = p2;
g++编译错误的样例:
char ** p2;
const char** p1 = p2;
1. 什么? g++编译错误? 我gcc第一个不服!
当我看到我将int**
类型赋值给const int**
类型的代码被g++狠狠打上一个error
之后,我第一反应是, 这怎么可能不行?把一个不带const的赋值给带const的, 不是理所当然应该编译通过吗?我脑洞大开想起了gcc, 希望gcc能站在我这边给予我赞同。于是我使用gcc编译了完全相同的这两行代码, 编译通过!我很感动, 但是我没法忽略gcc给我留下温柔的警告:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]