因此,一旦初始化带有至少一个参考变量的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,但这不是我要在这里做的。我想做的是建立一对新的配对,并将其内容分配给现有的一个,这在技术上是不一样的。
谢谢!
答案 0 :(得分:5)
引用在C ++中始终以相同的方式工作。
int a;
int &b=a;
b
始终是对a
的引用,直到b
超出范围并被销毁为止。
在std::pair
或其他任何地方的引用都以相同的方式工作。一旦绑定,它们将始终引用绑定到的同一对象。分配给引用将始终分配给被引用的对象。
对int
,char
或任何其他对象的引用也无关紧要。在这方面,引用始终以相同的方式工作。
答案 1 :(得分:1)
...但是你可以。尝试分配参考是不可能的,但是您可以达到相同的效果
new (&foo) std::pair<int, int&>(33, b);
将销毁旧的一对†并构造一个引用b
的新对。您是正确的,一对具有引用成员的对与普通引用不同。
这里有许多rules,注意事项和出错方法。只是接受引用不是为了重新分配。
†但不要调用析构函数,这很好。由于this,新的Placement在C ++ 20中不太容易出错。
答案 2 :(得分:0)
我要做的是建立一对新配对,并将其内容分配给现有的一个,这在技术上是不一样的。
您可以做到。配对的分配运算符分配每个成员。分配参考成员后,即会分配参考对象。如果您希望此分配重新绑定该对成员,则您希望知道的事情不可能。