如何初始化std :: array <t,2 =“”>其中T是不可复制的和非默认可构造的?

时间:2016-07-29 01:59:48

标签: c++

我有T类对象的固定数量,这些对象是不可复制的和非默认可构造的。由于大小是固定的,我想使用像std::array而不是unique_ptrvector这样的数组容器。如果我可以帮助的话,我想避免额外的间接层。

如何初始化std::array<T, 2>?使用array<T, 2> {T(...), T(...)}会导致有关已删除的复制构造函数的错误。使用array<T, 2> {move(T(...)), move(T(...))}不会强制数组元素使用移动构造函数。如果std::array<T, 2>本身不起作用,我还可以做什么,而不需要使用额外的间接层或手动内存管理技术,如placement-new?

2 个答案:

答案 0 :(得分:5)

无需额外的东西,只需直接初始化:

class Foo {
public:
    Foo() = delete;
    Foo(int,char) {}

    Foo(Foo const &) = delete;
    Foo & operator = (Foo const &) = delete;
};
    std::array<Foo, 2> arr {{ {1, '1'}, {2, '2'} }};

DEMO

答案 1 :(得分:0)

我的例子不是最好的,但是它可以工作..只需创建一个make_array的函数,让它为你创建实例..

http://ideone.com/fxAO3t

#include <array>
#include <iostream>

class Foo
{
    public:
        Foo(int)
        {

        }

        Foo(const Foo &) = delete;

        Foo(Foo &&)
        {
            std::cout<<"Moved\n";
        }
};

template<class... Type>
constexpr std::array<typename std::common_type<Type...>::type, sizeof...(Type)> make_array(Type&&... t)
{
    return {std::forward<Type>(t)...};
}

int main() {
    auto arr = make_array(Foo{1}, Foo{2});
    return 0;
}

正如评论中所指出的,您可以std::array<Foo, 2> arr = {Foo{1}, Foo{2}}

我注意到你在帖子中试图move。你确定你的课程是moveable吗?