我有一个名为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<int,something>
,但找不到任何可用的 something
。
编辑:这有效
struct Foo {
Foo() {}
Foo(Foo&& other) : pointer(std::move(other.pointer)) {}
std::unique_ptr<Bar> pointer;
};
但我的真实结构包含很多成员,我不想在移动构造函数中编写所有这些。
答案 0 :(得分:1)
MSVC10(在Visual Studio 2010中)尚未实现隐式移动构造函数(这并不奇怪,因为隐式移动构造函数很晚才进入标准 - 有很多关于它的讨论)。它们也不会出现在MSVC11中(在尚未发布的Visual Studio 2012中)。
我建议使用=default
,但也不支持。
答案 1 :(得分:0)
我认为Visual C ++ 2010不支持移动构造函数。
答案 2 :(得分:-1)
C ++ 11移动构造函数的最大好处是它可以与复制构造函数共存。如果您没有并且不需要复制构造函数,并且您的C ++标准库实现缺少支持,则可以通过显式执行移动或重新实现逻辑来简单地在复制构造函数中实现移动。 p>
唯一的缺点是,当您尝试复制而不是移动结构时,您将不会遇到任何编译时错误,这将导致可能会出现细微问题(可能再次)找到..