我有固定数量的T类对象,它们是不可复制和非默认可构造的。因为大小是固定的,所以我想使用一个类似数组的容器,比如std::array,而不是unique_ptr或vector。如果可以的话,我希望避免额外的间接层。
如何初始化std::array<T, 2>?使用array<T, 2> {T(...), T(...)}会导致有关已删除副本构造函数的错误。使用array<T, 2> {move(T(...)), move(T(...))}不会强制数组元素使用move构造函数。如果std::array<T, 2>本质上不工作,我还能做什么,而不是求助于额外的间接层或手动内存管理技术,如placement-new?
发布于 2016-07-29 10:35:08
不需要额外的东西,只需直接初始化:
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
发布于 2016-07-29 10:22:39
我的例子不是最好的,但它是有效的。只需创建一个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吗?
https://stackoverflow.com/questions/38649378
复制相似问题