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;