我有T类对象的固定数量,这些对象是不可复制的和非默认可构造的。由于大小是固定的,我想使用像std::array
而不是unique_ptr
或vector
这样的数组容器。如果我可以帮助的话,我想避免额外的间接层。
如何初始化std::array<T, 2>
?使用array<T, 2> {T(...), T(...)}
会导致有关已删除的复制构造函数的错误。使用array<T, 2> {move(T(...)), move(T(...))}
不会强制数组元素使用移动构造函数。如果std::array<T, 2>
本身不起作用,我还可以做什么,而不需要使用额外的间接层或手动内存管理技术,如placement-new?
答案 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'} }};
答案 1 :(得分:0)
我的例子不是最好的,但是它可以工作..只需创建一个make_array
的函数,让它为你创建实例..
#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
吗?