问题源于今天我于csdn上看到的一个帖子: const引用的疑惑 例子1: #include <iostream > #include <typeinfo > using namespace std; typedef char* PCHAR ; int main(int argc, char *argv[]) { cout < <typeid(const PCHAR).name() < <endl; cout < <typeid(const char*).name() < <endl; return 0; } 输出结果: char * char const *应该两者都是char const *类型啊? 为什么不一样? 例子2: #include <iostream > #include <typeinfo > using namespace std; template <class T > void TestFunc2(const T &pConstRef) { cout < < pConstRef < <endl; pConstRef[0] = 'S '; cout < < pConstRef < < endl; } int main(int argc, char *argv[]) { char pBuf[100] = "suntao"; char* pNonConst = pBuf; TestFunc2(pNonConst); system("PAUSE"); return EXIT_SUCCESS; } 问题: 虽然我传入的是一个非const引用,但TestFunc2的参数是一个const引用,为什么可以修改pConstRef指向的内存? 这使我想起《C++ Primer》上的一段话(p104 3.12): “下面是一个几乎所有人刚开始时都会答错的问题,错误在于将typedef 当作宏扩展。已知下面的typedef:typedef char *cstring;在以下声明中cstr 的类型是什么?extern const cstring cstr;第一个回答差不多都是:const char *cstr即指向const 字符的指针。但是这是不正确的。const 修饰cstr 的类型。cstr 是一个指针,因此,这个定义声明了cstr 是一个指向字符的const 指针char *const cstr;” 所以基本上清楚了,发帖的人没搞明白typedef的含义。const T &pConstRef 即 T const &pConstRef . 这里的const好像是多余的。引用本来就不必用const修饰。

评论