相對(duì)clang,VS2010對(duì)rvalue的檢查還是若了些。
比如如下的程序,在VS2010順利編譯通過(guò),而在clang中則報(bào)錯(cuò)。
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的輸入?yún)?shù)是一個(gè)非const引用,即需要傳入的是個(gè)非臨時(shí)值。而在
ComplexAlgo(GetXY(10,10));
中,GetXY返回的是為臨時(shí)值,從邏輯上應(yīng)該為const的,即等價(jià)為:
const XY GetXY(int x, int y)
{
return XY(x, y);
}
所以,上面的程序不應(yīng)該編譯通過(guò)。而VS2010順利通過(guò),也使有著同樣用法的程序潛伏著bug。