std::p riority_queue<struct with const member&> - 'operator =' 函数不可用



我正在尝试将带有const member和的结构添加到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:"运算符 ="函数在"A"中不可用 c:...\算法 2322

我的 A 没有运算符 = 重载,因为它不能,因为 const int&i。

我有办法做到这一点吗?

该成员需要是一个引用,并且只能在此引用上调用 const 函数,但我不介意结构中的值是否更改。

我尝试使用 int&constm_i 并实现运算符 =,但后来我无法使用 const int 参数初始化 emplace(而且我可能不太了解 a & const 是什么与 const&(。

您可以使用间接寻址来解决此问题。(优先级(队列要求元素是可分配的。指针是可分配的。因此,队列可以保存指向A对象的指针,而不是保存不可分配的A对象。您可能希望队列拥有元素,在这种情况下,您应该使用智能指针(以为每个元素分配单独的内存为代价(。例:

std::priority_queue<std::unique_ptr<A>> q;
q.push(std::make_unique<A>(f));

另一方面,您可以通过使用指针代替引用来轻松地使A可分配。我建议您考虑拥有引用成员是否真的是一个明智的要求。出于某些强制您具有引用的原因,std::reference_wrapper(也是可分配的(可能就足够了。

最新更新