我最近安裝了Visual Studio 2010專業版RC來嘗試,並測試了在VC中實現的一些C++ 0x特性的++ 2010問題的「可移動的,只有類型」,在VC++ 2010
我實例化一個std::vector
的std::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實現此功能(可能已知)的錯誤?
感謝您的確認! – 2010-04-26 22:22:01