当前位置: 首页 > 知识库问答 >
问题:

嵌入d::a不能默认构造的不可移动对象

郭翰墨
2023-03-14

我有一个类包含一个std::mutex,因此它不可移动或复制。

struct MyObject {
  MyObject(std::string s_) : s(s_) {};
  std::mutex lock;
  std::thread worker;
  std::string s;
};

我可以轻松地将此对象添加到此地图:

 std::map<int, MyObject> my_map;
 my_map.emplace(std::piecewise_construct, 
                std::forward_as_tuple(5),
                std::forward_as_tuple("string0"));

但是我想用一个std::array来保存其中的几个:

std::map<int, std::array<MyObject, 3>> my_map;

如果MyObject是可移动的,那么我可以:

my_map.emplace(4, {MyObject("string0"), MyObject("string1"), MyObject("string2")});

但是当MyObject不可移动时,这就不起作用了(正如预期的那样)。我不能退回到分段构造,因为std::array不能从3个字符串的元组构造。

 my_map.emplace(std::piecewise_construct, 
                std::forward_as_tuple(4),
                std::forward_as_tuple("string0", "string1", "string2"));

有没有一种方法可以在地图中构建一个由不可移动对象组成的std::array

我用这些问题作为参考。有没有办法把答案结合起来?

安置和无序的地图

如何将不可复制和不可移动的对象分配到std::map?

我也尝试过:

std::array<MyObject, 3> list = {
  MyObject("string0"),
  MyObject("string1"),
  MyObject("string2")
};

my_map.emplace(4, std::move(list));

他们认为列表应该是可移动的,但这也行不通。

共有1个答案

范凡
2023-03-14

使用自定义数组,您可能会这样做

template <typename T, std::size_t N>
struct MyArray
{
    template <typename... Us>
    MyArray(Us&&... args) : arr{ std::forward<Us>(args)...} {}

    std::array<T, N> arr;
};

void foo()
{
    std::map<int, MyArray<MyObject, 3>> my_map;
    my_map.emplace(std::piecewise_construct,
                   std::forward_as_tuple(4),
                   std::forward_as_tuple(std::string("string0"),
                                         std::string("string1"),
                                         std::string("string2")));
}

演示

 类似资料:
  • 问题内容: 我正在学习Go,并且一直沉迷于Go旅游(exercise- stringer.go:https : //tour.golang.org/methods/7)。 这是一些代码: 所以我想出了is 的内部表示,所以散布算子起作用了。但我得到: 有没有搞错?字符串切片也不起作用,这是怎么回事? 编辑 :对不起,我的问题中有一个错误- 错误是关于type的,不是。我在玩代码,并且粘贴了错误的输

  • 似乎一个向量会检查move构造函数是否标记为noexcept,然后再决定重新分配时是移动还是复制元素。默认的移动构造函数是否定义为noexcept?我看到了以下文档,但它没有指定这一点。http://en.cppreference.com/w/cpp/language/move_constructor 隐式声明移动构造函数 如果没有为类类型(struct,类或联合),并且以下所有都是真的:没有用户

  • GCC和Clang接受此代码,并且能够在这两种情况下使用复制省略。 在中,MSVC抱怨无法返回,因为删除了的move构造函数。但是,我希望它能够依靠复制构造函数。这是MSVC中的一个bug,还是这个想要的行为(我不明白)和GCC/Clang太允许了? 如果我提供了一个move构造函数,MSVC就可以在编译为release时省略move。

  • 问题内容: 我正在使用Spring MVC控制器项目。下面是我的Controller,我声明了一个构造函数,该构造函数专门用于测试。 每当我启动服务器时,都会遇到以下异常- 但是,如果我删除构造函数,那么它将正常工作而不会出现任何问题。我在这里做什么错? 但是,如果我添加此默认构造函数,则它将开始正常工作- 问题答案: 如果要创建自己的构造函数,则必须定义无参数或默认构造函数。 您可以了解为什么需

  • 我正在与Spring MVC控制器项目。下面是我的控制器,我声明了一个构造函数,我专门用于测试目的。

  • 在尝试向CDI bean(ApplicationScoped)的构造函数中注入参数时,我遇到了以下问题: 但是,我在类上确实有一个可注入的构造函数: 有什么想法这里出了什么问题吗?