2010-04-21 39 views
10

我最近安裝了Visual Studio 2010專業版RC來嘗試,並測試了在VC中實現的一些C++ 0x特性的++ 2010問題的「可移動的,只有類型」,在VC++ 2010

我實例化一個std::vectorstd::unique_ptr,沒有任何問題。但是,當我嘗試通過將臨時對象傳遞給push_back來填充它時,編譯器會抱怨unique_ptr的複製構造函數是私有的。我試圖通過移動它來插入一個左值,它工作得很好。

#include <utility> 
#include <vector> 

int main() 
{ 
    typedef std::unique_ptr<int> int_ptr; 

    int_ptr pi(new int(1)); 

    std::vector<int_ptr> vec; 

    vec.push_back(std::move(pi));  // OK 
    vec.push_back(int_ptr(new int(2))); // compiler error 
} 

事實證明,問題既不是unique_ptr也不vector::push_back但右值打交道時,VC++解決重載的方式,通過下面的代碼演示:

struct MoveOnly 
{ 
    MoveOnly() {} 
    MoveOnly(MoveOnly && other) {} 

private: 

    MoveOnly(const MoveOnly & other); 
}; 

void acceptRValue(MoveOnly && mo) {} 

int main() 
{ 
    acceptRValue(MoveOnly()); // Compiler error 
} 

編譯器抱怨副本構造函數不可訪問。如果我公開它,程序編譯(即使複製構造函數未定義)。

我誤解了右值引用的內容,還是VC++ 2010實現此功能(可能已知)的錯誤?

回答

12

不幸的是,/ Za是越野車。當它不應該(綁定右值引用不會調用複製構造函數,即使在理論上)時,它也會執行消除拷貝構造函數的可訪問性。結果,/ Za不應該被使用。

斯蒂芬T. Lavavej時,Visual C++庫開發([email protected]

+0

感謝您的確認! – 2010-04-26 22:22:01

1

首先,你需要一個緊密)

vec.push_back(int_ptr(new int(2)); //編譯器錯誤

現在我沒有編譯器錯誤,無論是第一種還是第二種情況。

我使用Visual Studio 2010測試版。

+0

對不起,我一定不小心寫我的問題時刪除括號。感謝您在測試版中測試這個功能,它增強了我的感覺,即這是RC中的一個錯誤... – 2010-04-21 12:37:00

+0

在VS2010 RC上適合我。 – Sumant 2010-04-21 13:44:10

+0

嗯,這是越來越怪異和怪異。你能提供你安裝的Visual C++ 2010的確切版本嗎? – 2010-04-21 13:55:47

1

我注意到我禁用了語言擴展(\ Za)。啓用擴展後,代碼將正確編譯。我仍然認爲這是一個錯誤,因爲這裏提供的代碼是完全標準的(據我所知)並且不依賴任何Microsoft擴展。