问题源于今天我于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修饰。