有一次我在VS中遇到这样的一个编译错误,代码如下(程序1):
typedef char * string;
class A
{
private:
char value[256];
public:
const string getValue() const
{
return value;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
编译错误:error C2440: 'return' : cannot convert from 'const char [256]' to 'const string'
为什么会有这样的编译错误呢?不是数组名可以转换成一个指针吗(此主题可参考),按此原理类推应该可以实现此类型转换。于是我改写代码(程序2):
typedef char * string;
class A
{
private:
char value[256];
public:
const char * getValue() const
{
return value;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
这时编译这段代码却没有错误乐。为什么呢?原因在于在程序1中const从整体上修饰类型别名string(char *),那么就相当于char * const,表示char类型的指针为常量,所以就出现上述的编译错误。错误的根本原因就是我把typedef主观认为可以与#define等同,而typedef实际上却是定义一种类型的别名,而不只是简单的宏替换。这次经历也告诉我一个道理:不能凭主观或者说错误的观点进行推测,而应该认识到实践才是检验真理的唯一标准。