2012-11-28 78 views
3

我已經用vs2011編譯了這段代碼。它首先打印構造函數然後複製構造函數。 但是,如果我更改函數返回a而不是ap,它將移動該對象。這是一個錯誤還是爲什麼它的行爲如此? * ap不是右值嗎?按值返回指針不會移動對象

struct A 
{ 
    A() { cout << "constructor" << endl;} 
    A(const A&) { cout << "copy constructor " << endl;} 
    void operator=(const A&) { cout << "assignment operator" << endl; } 
    A(A&&) { cout << "move copy constructor" << endl;} 
    void operator=(A&&) { cout << "move assignment operator" << endl;} 
}; 

A func() { A a; A *ap = &a; return *ap; } 

int main() 
{ 
    A a = func(); 
    return 0; 
} 

回答

6

*ap是一個左值(第5.3.1.1,n3290),它一般不是安全的移動自動發生。本地變量return a;different case。編譯器沒有要求證明在這個特定的情況下它是安全的。這是在不真正需要指針語義的情況下不使用指針的另一個好理由。

將其更改爲:

return std::move(*ap); 

將導致它不過是明確移動。

+1

安** xvalue ** !?突然間,我感到非常失去聯繫。感謝您的鏈接。 – NPE