我最近安装了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