为什么这不编译? (它需要std :: unique_ptr<>的复制构造函数)
std::vector<std::unique_ptr<int>> vec{std:unique_ptr<int>(new int)};
创建的指针是一个r值,为什么不能将它移动到向量中?
是否有同样简短的初始化矢量的方法?
答案 0 :(得分:0)
一个简单的问题是,std::unique_ptr
的copy-ctor为deleted
,但找到的construct
std::
会调用::new
,触发一个template <class _Up, class... _Args>
_LIBCPP_INLINE_VISIBILITY
void
construct(_Up* __p, _Args&&... __args)
{
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
}
打电话给那个已删除的副本。
的libc ++ / ++铛 - 3.5
/ usr / include / c ++ / v1 / memory:1645:31:错误:调用'std :: __ 1 :: unique_ptr&gt;'的隐式删除的复制构造函数
/usr/include/c++/4.9/bits/stl_construct.h:75: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>]’
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
的libstdc ++ /克++ - 4.9
template<typename T>
struct allocator : public std::allocator<T> {
using Base = std::allocator<T>;
using Base::Base;
template<typename U>
struct rebind {typedef allocator<U> other;};
template<typename Up, typename... Args>
void construct(Up* p, Args&&... args);
};
尝试将std::allocator的自定义重载用作容器的分配器类型时,有点诱人。
对于那些无法抗拒诱惑的人(像我一样)
要使编译器至少使用使用自定义分配器,它至少需要此最小填充。
construct
这还没有完成(更不用说我已经 public interface Listener{
void onDismiss();
}
正确地重新实现了),但至少它将从lib的深渊中的错误召唤到自定义源文件的白天。