相对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。