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扩展。