C++ std::pair with references和reference wrappers之间有什么区别

C++ std::pair with references和reference wrappers之间有什么区别,c++,std-pair,reference-wrapper,C++,Std Pair,Reference Wrapper,我犯了一个错误的假设。我发现 std::pair<int &, int &> 我有点希望它的行为类似于引用包装器,底层指针将被复制,但它似乎不是这样工作的。是否有明确的理由说明行为与使用不同 std::pair<std::reference_wrapper<int>, std::reference_wrapper<int>> std::pair 如果我运行与上面相同的测试,但是使用了reference\u包装器,那么它就可以工

我犯了一个错误的假设。我发现

std::pair<int &, int &>
我有点希望它的行为类似于引用包装器,底层指针将被复制,但它似乎不是这样工作的。是否有明确的理由说明行为与使用不同

std::pair<std::reference_wrapper<int>, std::reference_wrapper<int>>
std::pair 如果我运行与上面相同的测试,但是使用了reference\u包装器,那么它就可以工作了

{
        int a = 10;
        int b = 20;
        int c = 30;

        using PRef = std::pair<std::reference_wrapper<int> , std::reference_wrapper<int>>;

        PRef p0 = {std::ref(a),std::ref(b)};
        PRef p1 = {std::ref(b),std::ref(c)};


        EXPECT_EQ(a, 10);
        EXPECT_EQ(b, 20);
        EXPECT_EQ(c, 30);

        p0 = p1;

        EXPECT_EQ(a, 10);
        EXPECT_EQ(b, 20);
        EXPECT_EQ(c, 30);


    }
{
INTA=10;
int b=20;
int c=30;
使用PRef=std::pair;
PRef p0={std::ref(a),std::ref(b)};
PRef p1={std::ref(b),std::ref(c)};
期望q(a,10);
期望q(b,20);
期望q(c,30);
p0=p1;
期望q(a,10);
期望q(b,20);
期望q(c,30);
}

这两种形式之间应该有区别吗?

它有这种行为的原因与

int a = 10;
int b = 20;

int &aref = a;
int &bref = b;

aref = bref;
a
分配给
b
。真正的引用(与引用包装相反)无法恢复。赋值给引用调用赋值运算符来处理引用的内容


重新绑定引用。因此,如果
aref
bref
std::reference\u wrapper
s,则赋值不会改变
a

注意
reference\u wrapper
operator=
重新绑定它:,与引用不同。我认为如果没有提到
std::pair
,这个问题和适当的答案是一样的。@DanielLangr这看起来像个答案。@cigien还没有时间在问题的上下文中写出来。任何人都可以这样做。我不确定这是不是真的复制品。回答的问题是相关的,因为它讨论了引用赋值的行为,但它没有解决这个问题所涉及的
std::reference\u wrapper
的不同行为。下面的内容可能也会有所帮助。
{
        int a = 10;
        int b = 20;
        int c = 30;

        using PRef = std::pair<std::reference_wrapper<int> , std::reference_wrapper<int>>;

        PRef p0 = {std::ref(a),std::ref(b)};
        PRef p1 = {std::ref(b),std::ref(c)};


        EXPECT_EQ(a, 10);
        EXPECT_EQ(b, 20);
        EXPECT_EQ(c, 30);

        p0 = p1;

        EXPECT_EQ(a, 10);
        EXPECT_EQ(b, 20);
        EXPECT_EQ(c, 30);


    }
int a = 10;
int b = 20;

int &aref = a;
int &bref = b;

aref = bref;