为什么不能使用initializer_list初始化std :: vector of uncopiable对象?

时间:2015-11-10 09:48:55

标签: c++11 stdvector initializer-list

为什么这不编译? (它需要std :: unique_ptr<>的复制构造函数)

std::vector<std::unique_ptr<int>> vec{std:unique_ptr<int>(new int)};

创建的指针是一个r值,为什么不能将它移动到向量中?

是否有同样简短的初始化矢量的方法?

1 个答案:

答案 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的深渊中的错误召唤到自定义源文件的白天。