首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何初始化std::array<T,2>,其中T是不可复制和非默认可构造的?

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

Stack Overflow用户
提问于 2016-07-29 09:59:48
回答 2查看 260关注 0票数 7

我有固定数量的T类对象,它们是不可复制和非默认可构造的。因为大小是固定的,所以我想使用一个类似数组的容器,比如std::array,而不是unique_ptrvector。如果可以的话,我希望避免额外的间接层。

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

EN

回答 2

Stack Overflow用户

发布于 2016-07-29 10:35:08

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

代码语言:javascript
复制
class Foo {
public:
    Foo() = delete;
    Foo(int,char) {}

    Foo(Foo const &) = delete;
    Foo & operator = (Foo const &) = delete;
};
代码语言:javascript
复制
    std::array<Foo, 2> arr {{ {1, '1'}, {2, '2'} }};

DEMO

票数 5
EN

Stack Overflow用户

发布于 2016-07-29 10:22:39

我的例子不是最好的,但它是有效的。只需创建一个make_array函数并让它为您创建实例即可。

http://ideone.com/fxAO3t

代码语言:javascript
复制
#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吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38649378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档