0

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

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

现在我正在尝试将实例存储Foounordered_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_pairstd::pair<int,something>但找不到任何something有效的方法。


编辑:这有效

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

但是我的真实结构包含很多成员,我不想把它们都写在move构造函数中。

4

3 回答 3

1

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

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

于 2012-06-03T13:36:22.703 回答
0

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

于 2012-06-03T12:46:38.770 回答
-1

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

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

于 2012-06-03T15:19:45.267 回答