【问题标题】:Visual C++ 2010 : unordered_map and move constructorVisual C++ 2010:unordered_map 和移动构造函数
【发布时间】:2012-06-03 23:19:45
【问题描述】:

我有一个名为 Foo 的结构,其中包含一个 unique_ptr

struct Foo {
    std::unique_ptr<Bar> pointer;
};

现在我正在尝试将Foo 的实例存储在unordered_map

std::unordered_map<int,Foo> myMap;

从技术上讲,这应该是可能的,因为地图不需要复制构造函数,只需要移动构造函数。

但是,我无法在我的地图中插入元素:

myMap.insert(std::make_pair(3, Foo()));

这一行会在 Visual C++ 2010 中产生以下错误(由我粗略翻译,因为我的编译器不是英文的):

error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : unable to access private member declared in 'std::unique_ptr<_Ty>'  
with
[
             _Ty=Foo
]
c:\Softwares\Visual Studio 10.0\VC\include\memory(2347) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
with
[
             _Ty=Foo
]
This diagnostic happened in the compiler-generated function 'Foo::Foo(const Foo&)'

因此,由于未知原因,编译器尝试为Foo 生成复制构造函数而不是移动构造函数,但失败了。

我尝试将std::make_pair 替换为std::pair&lt;int,something&gt;,但找不到任何有效的something


编辑:这行得通

struct Foo {
    Foo() {}
    Foo(Foo&& other) : pointer(std::move(other.pointer)) {}
    std::unique_ptr<Bar> pointer;
};

但我的真实结构包含很多成员,我不想将它们全部写在移动构造函数中。

【问题讨论】:

    标签: c++ visual-studio-2010 constructor move unordered-map


    【解决方案1】:

    MSVC10(在 Visual Studio 2010 中)尚未实现隐式移动构造函数(这并不奇怪,因为隐式移动构造函数很晚才进入标准 - 对此进行了很多讨论)。它们也不会出现在 MSVC11 中(在尚未发布的 Visual Studio 2012 中)。

    我建议使用=default,但这也不支持。

    【讨论】:

      【解决方案2】:

      我认为 Visual C++ 2010 不支持移动构造函数。

      【讨论】:

      • 如果不支持,那么unique_ptr也不会被支持
      【解决方案3】:

      C++11 移动构造函数最大的好处是它可以与复制构造函数共存。如果您没有也不想要复制构造函数,并且您的 C++ 标准库实现缺乏 emplace 支持,您可以在复制构造函数中简单地实现移动,通过显式执行移动或重新实现逻辑。

      这样做的唯一缺点是,当您尝试复制而不是移动结构时,您不会遇到任何编译时错误,这将导致可能会(再次可能)花费您一段时间的微妙问题找到..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 2012-05-11
        • 2021-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多