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