Sag*_*ual 2 c++ vector unique-ptr c++11
多年后回到C++; 试图赶上C++ 11和14.我已经阅读了关于rvalues和移动语义的内容.我以为我理解了这个概念.显然不是.我看过几十个例子.但我根本无法编译我的代码.我必须遗漏一些明显的例子.我总是得到关于复制ctor被删除的错误,因为unique_ptr<int>有一个用户声明的移动ctor.显然我对这个概念缺少了一些东西,但我无法弄清楚它是什么.这是代码,根据其本质:
#include <memory>
#include <utility>
#include <vector>
int main(int, char*[]) {
auto oneInt{std::make_unique<int>(0)};
auto someInts{std::vector<std::unique_ptr<int>>{std::move(oneInt)}};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
编辑:这是这个特定代码的错误.请注意,我已经尝试了我能想到的代码的每个变体,结果各不相同,但基本问题始终是相同的:复制ctor已删除,因为unique_ptr<int>有一个用户声明的移动ctor.
编辑:我已将代码更新为#include <memory>,并粘贴了新错误.我只能希望问题是那样的傻事.
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1752:31: error: call to implicitly-deleted copy constructor of
'std::__1::unique_ptr<int, std::__1::default_delete<int> >'
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1668:18: note: in instantiation of function template
specialization 'std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > >::construct<std::__1::unique_ptr<int, std::__1::default_delete<int> >,
const std::__1::unique_ptr<int, std::__1::default_delete<int> > &>' requested here
{__a.construct(__p, _VSTD::forward<_Args>(__args)...);}
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1514:14: note: in instantiation of function template
specialization 'std::__1::allocator_traits<std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::__construct<std::__1::unique_ptr<int,
std::__1::default_delete<int> >, const std::__1::unique_ptr<int, std::__1::default_delete<int> > &>' requested here
{__construct(__has_construct<allocator_type, _Tp*, _Args...>(),
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1598:17: note: in instantiation of function template
specialization 'std::__1::allocator_traits<std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::construct<std::__1::unique_ptr<int,
std::__1::default_delete<int> >, const std::__1::unique_ptr<int, std::__1::default_delete<int> > &>' requested here
construct(__a, _VSTD::__to_raw_pointer(__begin2), *__begin1);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:1024:21: note: in instantiation of function template
specialization 'std::__1::allocator_traits<std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::__construct_range_forward<const
std::__1::unique_ptr<int, std::__1::default_delete<int> > *, std::__1::unique_ptr<int, std::__1::default_delete<int> > *>' requested here
__alloc_traits::__construct_range_forward(__a, __first, __last, this->__end_);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:1285:9: note: in instantiation of function template
specialization 'std::__1::vector<std::__1::unique_ptr<int, std::__1::default_delete<int> >, std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> >
> >::__construct_at_end<const std::__1::unique_ptr<int, std::__1::default_delete<int> > *>' requested here
__construct_at_end(__il.begin(), __il.end(), __il.size());
^
virtual.cpp:7:21: note: in instantiation of member function 'std::__1::vector<std::__1::unique_ptr<int, std::__1::default_delete<int> >,
std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::vector' requested here
auto someInts{std::vector<std::unique_ptr<int>>{std::move(oneInt)}};
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2621:31: note: copy constructor is implicitly deleted because
'unique_ptr<int, std::__1::default_delete<int> >' has a user-declared move constructor
_LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
Run Code Online (Sandbox Code Playgroud)
您的代码存在很多问题.首先,过度使用{}初始化会混淆事物.使用auto很好,但auto x{...};声明充满了危险,因为其意义auto x{single_value}随着时间的推移而变化.最好auto x = single_value;在合理的地方使用语法.
其次,您无法unique_ptr通过{}初始化列表将a 插入容器.完全没有.经历的项目std::initializer_list 必须是可复制的,而unique_ptr不是.
你想要的是这个:
auto oneInt = std::make_unique<int>(0);
std::vector<std::unique_ptr<int>> someInts;
someInts.push_back(std::move(oneInt));
Run Code Online (Sandbox Code Playgroud)