【问题标题】:Problem with "moveable-only types" in VC++ 2010VC++ 2010 中“仅可移动类型”的问题
【发布时间】:2011-02-10 12:53:19
【问题描述】:

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

事实证明,问题既不是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 实现此功能的一个(可能已知的)错误?

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++ c++11 rvalue-reference


    【解决方案1】:

    不幸的是,/Za 有问题。它在不应该执行的时候执行省略的复制构造函数可访问性检查(绑定右值引用不会调用复制构造函数,即使在理论上也是如此)。因此,不应使用 /Za。

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

    【讨论】:

      【解决方案2】:

      首先,你需要关闭)

      vec.push_back(int_ptr(new int(2))); // 编译错误

      现在,无论是第一种情况还是第二种情况,我都没有编译器错误。

      我使用 Visual Studio 2010 Beta。

      【讨论】:

      • 对不起,我一定是在写我的问题时不小心擦掉了括号。感谢您在 Beta 版中对此进行测试,这让我更加觉得这是 RC 中的一个错误......
      • 在 VS2010 RC 上对我来说很好。
      • 哼,越来越奇怪了。您能否提供您安装的 Visual C++ 2010 的确切版本?
      • Microsoft Visual Studio 2010 10.0.30128.1 RC1Rel
      • 我有相同的版本,原来问题是我禁用了语言扩展。
      【解决方案3】:

      我注意到我禁用了语言扩展 (\Za)。启用扩展后,代码会被正确编译。我仍然认为这是一个错误,因为这里提供的代码是完全标准的(据我所知)并且不依赖于任何 Microsoft 扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-16
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多