使用 gcc 8.4 使用不可复制的类型设置 unordered_map 时出错
Error setting up unordered_map with non copying-able type with gcc 8.4
看这里:https://godbolt.org/z/MW3jW6
使用 gcc 8.4(godbolt 中的 8.3)我的代码编译失败。使用 gcc 10.x 似乎可以编译。但是我无法弄清楚错误到底在告诉我什么...
参考代码如下:
#include <mutex>
#include <condition_variable>
#include <iostream>
#include <unordered_map>
class non_copy
{
public:
non_copy() = default;
non_copy(non_copy&&){}
non_copy(non_copy&) = delete;
private:
std::mutex m;
std::condition_variable cv;
};
class item
{
public:
item() = default;
item(item&&){}
private:
non_copy m_item; // Works if I remove this
};
bool test()
{
// does not work
std::unordered_map<int, item> map; // Error here
map.emplace(1, item());
// Works ok
std::unordered_map<int, std::string> map2;
map2.emplace(1, "test");
return true;
}
int main()
{
std::cout << "test" << std::endl;
return test();
}
如果我从 item
class 中删除 non_coom m_item
然后它编译。我认为我只需要创建移动构造函数,但这还不够。 map.emplace - 所以我读到 - 应该将右值引用(移动 c'tor)作为参数。所以我想我在这里有点困惑。
我想要做的只是将新的 item
s 插入到映射中——我不关心处理内容——所以互斥锁和条件变量将只是默认构造的。
注意: 查看我在 link 中遇到的错误 - 它相当大,但如果需要我可以将其复制到此处
你的复制构造函数(const
),即使合法是不寻常的,而且看起来有问题。
使用普通的:
non_copy(const non_copy&) = delete;
看这里:https://godbolt.org/z/MW3jW6
使用 gcc 8.4(godbolt 中的 8.3)我的代码编译失败。使用 gcc 10.x 似乎可以编译。但是我无法弄清楚错误到底在告诉我什么...
参考代码如下:
#include <mutex>
#include <condition_variable>
#include <iostream>
#include <unordered_map>
class non_copy
{
public:
non_copy() = default;
non_copy(non_copy&&){}
non_copy(non_copy&) = delete;
private:
std::mutex m;
std::condition_variable cv;
};
class item
{
public:
item() = default;
item(item&&){}
private:
non_copy m_item; // Works if I remove this
};
bool test()
{
// does not work
std::unordered_map<int, item> map; // Error here
map.emplace(1, item());
// Works ok
std::unordered_map<int, std::string> map2;
map2.emplace(1, "test");
return true;
}
int main()
{
std::cout << "test" << std::endl;
return test();
}
如果我从 item
class 中删除 non_coom m_item
然后它编译。我认为我只需要创建移动构造函数,但这还不够。 map.emplace - 所以我读到 - 应该将右值引用(移动 c'tor)作为参数。所以我想我在这里有点困惑。
我想要做的只是将新的 item
s 插入到映射中——我不关心处理内容——所以互斥锁和条件变量将只是默认构造的。
注意: 查看我在 link 中遇到的错误 - 它相当大,但如果需要我可以将其复制到此处
你的复制构造函数(const
),即使合法是不寻常的,而且看起来有问题。
使用普通的:
non_copy(const non_copy&) = delete;