我正在尝试使用const成员添加一个结构&到priority_queue 这是一个最小的例子:
#include <queue>
struct A
{
A(const int& i)
: m_i(i)
{
}
bool operator<(const A& other) const
{
return m_i < other.m_i;
}
const int& m_i;
};
int main()
{
std::priority_queue<A> q;
int i = 3;
const int& f = i;
q.emplace(f);
return 0;
}
我理解这个
的错误错误2错误C2582:&#39;运营商=&#39;功能在&#39; A&#39;中无法使用c:... \ algorithm 2322
我的A没有操作符=重载,因为它不能因为const int&amp;岛
我有办法让这项工作成功吗?
成员需要作为参考,并且只能在此引用上调用const函数,但是如果结构中的值发生更改,我不介意。
我尝试使用int&amp; const m_i并实现operator =然后我不能用const int参数初始化emplace(我可能不太了解&amp; const与const&amp;)。
答案 0 :(得分:3)
您可以使用间接解决此问题。 (优先级)队列要求元素可分配。指针是可分配的。因此,队列可以保存指向A
个对象的指针,而不是保留不可分配的A
个对象。您可能希望队列拥有元素,在这种情况下,您应该使用智能指针(以每个元素的单独内存分配为代价)。例如:
std::priority_queue<std::unique_ptr<A>> q;
q.push(std::make_unique<A>(f));
另一方面,您可以通过使用指针代替引用轻松地使A
可分配。我建议您考虑一下参考成员是否真的是一个明智的要求。由于某些原因迫使你有一个引用,std::reference_wrapper
(也可以赋值)可能就足够了。