如果我通过我的GCC 4.7快照传递以下代码,它会尝试将unique_ptrs 复制到向量中.
#include <vector>
#include <memory>
int main() {
using move_only = std::unique_ptr<int>;
std::vector<move_only> v { move_only(), move_only(), move_only() };
}
Run Code Online (Sandbox Code Playgroud)
显然,因为std::unique_ptr不可复制而无法工作:
错误:使用已删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr(const std :: unique_ptr <_Tp,_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp,_Dp> = std :: unique_ptr]'
GCC是否正确尝试从初始化列表中复制指针?
可能重复:
我可以列出 - 初始化只移动类型的向量吗?
我用gcc 4.6.1编译这段代码
int main()
{
std::vector<std::unique_ptr<int>> vec({
std::unique_ptr<int>(new int(0)),
std::unique_ptr<int>(new int(1)),
});
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在什么g ++抱怨有类似的东西
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/../../../../include/c++/4.6.1/bits/stl_construct.h:76:7: **error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&)** [with _Tp = int, _Dp = std::default_delete<int>, std::unique_ptr<_Tp, _Dp> = std::unique_ptr<int>]'
Run Code Online (Sandbox Code Playgroud)
在这种情况下,似乎g ++仍尝试复制构造函数,尽管我在初始化列表中添加的是r值.那么如何用初始化列表初始化一个noncopyable容器呢?
是否有一个标准容器具有相同的通用API,vector<T>但是通过直接默认构造填充新位置?
背景:
我有一个类型,不允许复制,但有一个默认的构造函数,我真正想做的是这样的:
vector<NoCopy> bag(some_size);
// use bag[i]'s
return; // bag & contents get correctly cleaned up.
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为它vector<T>(int)是根据默认构造对象然后将其复制到每个新位置来实现的.
编辑:不是C++ 0xB(又名C++ 11)