有没有一种方法可以更改std :: pair的引用成员指向的位置?

时间:2020-10-03 18:55:40

标签: c++

因此,一旦初始化带有至少一个参考变量的std::pair,例如这样的话:

int a = 53;
int b = 42;
std::pair<int, int&> foo(33, a);

是否可以更改参考变量指向的位置?

分配:

foo = std::make_pair(33, std::ref(b));

并交换:

std::pair<int, int&> bar(33, b);
foo.swap(bar);

似乎只是将新内容移动到a并留下foo的第二个成员指向之前的位置(a),因此没有做我在这里想要实现的目标。我知道引用不能反弹,因为 answered here,但这不是我要在这里做的。我想做的是建立一对新的配对,并将其内容分配给现有的一个,这在技术上是不一样的。

谢谢!

3 个答案:

答案 0 :(得分:5)

引用在C ++中始终以相同的方式工作。

int a;
int &b=a;

b始终是对a的引用,直到b超出范围并被销毁为止。

std::pair或其他任何地方的引用都以相同的方式工作。一旦绑定,它们将始终引用绑定到的同一对象。分配给引用将始终分配给被引用的对象。

intchar或任何其他对象的引用也无关紧要。在这方面,引用始终以相同的方式工作。

答案 1 :(得分:1)

您不应重新绑定引用...

...但是你可以。尝试分配参考是不可能的,但是您可以达到相同的效果

new (&foo) std::pair<int, int&>(33, b);

将销毁旧的一对并构造一个引用b的新对。您是正确的,一对具有引用成员的对与普通引用不同。

这里有许多rules,注意事项和出错方法。只是接受引用不是为了重新分配。

†​​但不要调用析构函数,这很好。由于this,新的Placement在C ++ 20中不太容易出错。

答案 2 :(得分:0)

我要做的是建立一对新配对,并将其内容分配给现有的一个,这在技术上是不一样的。

您可以做到。配对的分配运算符分配每个成员。分配参考成员后,即会分配参考对象。如果您希望此分配重新绑定该对成员,则您希望知道的事情不可能。