VC++ 2010中"仅可移动类型"的问题

Luc*_*lle 10 c++ visual-studio-2010 rvalue-reference visual-c++ c++11

我最近安装了Visual Studio 2010 Professional RC来试用它并测试VC++ 2010中实现的一些C++ 0x功能.

我实例化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
}
Run Code Online (Sandbox Code Playgroud)

事实证明,问题既不是unique_ptr也不vector::push_back是VC++在处理rvalues时解决重载的方式,如下面的代码所示:

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

private:

    MoveOnly(const MoveOnly & other);
};

void acceptRValue(MoveOnly && mo) {}

int main()
{
    acceptRValue(MoveOnly()); // Compiler error
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨无法访问复制构造函数.如果我将其公开,程序将编译(即使未定义复制构造函数).

我是否误解了rvalue引用的某些内容,或者它是VC++ 2010实现此功能的一个(可能是已知的)错误?

小智 12

不幸的是,/ Za是越野车.它不应该执行elided-copy-constructor-accessibility检查(绑定rvalue引用不会调用复制构造函数,甚至理论上也是如此).因此,不应使用/ Za.

Stephan T. Lavavej,Visual C++库开发人员(stl@microsoft.com)