力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks
相对clang,VS2010对rvalue的检查还是若了些。
比如如下的程序,在VS2010顺利编译通过,而在clang中则报错。
class XY
{
public:
    XY();
    XY(int x, int y)
        :_x(x)
        ,_y(y)
    {

    }
public:
    int _x;
    int _y;
};

XY GetXY(int x, int y)
{
    return XY(x, y);
}

void ComplexAlgo(XY& xy)
{
    xy._x = 100;
    xy._y = 200;
}

int _tmain(int argc, _TCHAR* argv[])
{
    ComplexAlgo(GetXY(10,10));
    return 0;
}

ComplexAlgo的输入参数是一个非const引用,即需要传入的是个非临时值。而在
    ComplexAlgo(GetXY(10,10));
 中,GetXY返回的是为临时值,从逻辑上应该为const的,即等价为:
const XY GetXY(int x, int y)
{
    return XY(x, y);
}

所以,上面的程序不应该编译通过。而VS2010顺利通过,也使有着同样用法的程序潜伏着bug。

posted on 2014-08-24 18:50 力为 阅读(1798) 评论(1)  编辑 收藏 引用 所属分类: 4. C++ FAQ

评论

# re: 为什么需要给函数返回类型加const 2014-08-25 10:02 冬瓜
返回值确实是临时值,但是你给变量接收后,又是另一种情况。
对于你那个ComplexAlgo如果你的参数是XY&是报错的,但是你改为const XY &就可以了。如果是XY p = GetXY(10,10);这个是不会错的。每个编译器实现会有所不一样,这个不能算是bug。  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理