我有一个类包含一个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));
他们认为列表应该是可移动的,但这也行不通。
使用自定义数组,您可能会这样做
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)的构造函数中注入参数时,我遇到了以下问题: 但是,我在类上确实有一个可注入的构造函数: 有什么想法这里出了什么问题吗?