重新拔插这样的一对引用是否合法

Is reseating a pair of references like this legal?

本文关键字:引用 是否 新拔插      更新时间:2023-10-16

我想重新放置一对引用refPair

int a, b, c, d;
pair<int&, int&> refPair(a, b);

这样做似乎会导致 c 和 d 的值被复制到 a 和 b,这是我不希望的

refPair = pair<int&, int&>(c, d);

但是,这样做不会

new(&refPair) pair<int&, int&>(c, d);

我想知道这是否合法并且不会导致任何未定义的行为。它适用于我的编译器,但我不确定它是否可移植。

我相当确定这是未定义的行为,因为像这样构建非平凡类是非法的(std::p air可以是非平凡的AFAIK)。

无论如何,看看std::reference_wrapper哪些是可以恢复的。

refPair = pair<std::reference_wrapper<int>, std::reference_wrapper<int> >(std::ref(c), std::ref(d));

你写道,

"想要重新拔插一对引用 refPair"

不可以,不能重新拔插引用。

从技术上讲,您可以改用指针。

但是你的原始代码所做的是没有意义的。而你修改后的"工作"代码所做的是毫无意义的,而且在形式上是不好的。因此,这很可能是一个XY问题,即你问的是想象的解决方案Y的缺点,而不是真正的问题X——这是什么?