在一个函数中有个参数是 CONST 类型,例如: string & max(string s1,string s2) ,那么我调用的时候有可能会这样写:max("abc","edf"); 然后编译,出错。提示为 无法将 CONST 类型转换为 非CONST 类型。那是因为编译器在接收到"abc"的时候会生成一个临时变量,然后将这个临时变量传入到 max 函数中。但是这个临时变量是 CONST 类型的,与该函数的定义不一致,所以会在编译时抛出类型不一致的错误。
因为这样做可以防止传递到函数内的临时值被修改。否则,程序员就会很奇怪地发现,只有编译器产生的临时值可以修改而他们在函数调用时实际传进去的参数却不行。(关于这一点是有事实根据的,早期版本的c++允许这类的临时值可以被产生,传递,修改,结果很多程序员感到很奇怪)
const string& max(const string& s1,const string& s2)
{
return s1;
};
然后调用
const string &s = max("abc", "edf");
在 VS2005 下编译不通过,错误提示为 :
error C2440: “return”: 无法从“const char *”转换为“const char (&)[4]”
但是在 LINUX 下用 KDEVELOP 编译却没有问题。我想可能是编译器在自动创建临时变量的时候的类型转换是不一样,当该函数在接受字符串参数的时候 KDEVELOP 能够将字符串转换成 CONST 的STRING 引用类型,但是 VS 却将其转换成了 const char * 。不知这样推断是否正确,可能还要再查下 MSDN 可能能够得出其中的一部分的答案,呵呵。