MySpace

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  18 随笔 :: 2 文章 :: 10 评论 :: 0 Trackbacks

在一个函数中有个参数是 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 可能能够得出其中的一部分的答案,呵呵。

posted on 2008-06-04 11:57 yang-chunlei 阅读(313) 评论(2)  编辑 收藏 引用

评论

# re: 编译器产生的临时值 2008-06-04 16:23 raof01
你传递的是引用,上哪生成临时对象去?所以不是临时变量的问题,而是类型检查的事。如果提供了隐式转换,你的代码就没有问题,所以KDEVELOP不会抱怨。  回复  更多评论
  

# re: 编译器产生的临时值 2008-06-05 08:45 春雷
@raof01
虽然传递的是引用,但是对于传进函数里的参数参数不是正确的类型——它是一个字符数组,编译器还是会生成一个临时的string对象,然后再将该对象传进这个函数。
大致的代码可能是:
const string temp1("abc");
const string temp2("abc");
max(temp1,temp2);


还有你后面说的“隐式转换”在VS下该怎么样提供?
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理