#include<iostream>
#include<utility>
#include<tuple>
#include<functional>
using namespace std;
int main()
{
int i = 0;
auto p = make_pair(ref(i), ref(i++));
p.first++;
p.second++;
cout << "i = " << i << endl;
}
例如,如果我像这样使用ref()
,编译器会说
使用删除的功能'无效std::ref(const_Tp
但是,如果我的代码如下
#include<iostream>
#include<utility>
#include<tuple>
#include<functional>
using namespace std;
int main()
{
int i = 0;
auto p = make_pair(ref(i), ref(++i));
p.first++;
p.second++;
cout << "i = " << i << endl;
}
我会成功得到输出i=3
,所以我无法理解为什么会得到如此不同的答案。
< code>std::ref接受一个变量,并给出一个类似于该变量的引用。
i
不是一个变量;这是暂时的。这是因为增量后的工作方式;原始值递增,但表达式的计算结果为旧值,并且需要临时值来保存该旧值,以便您可以读取它。
< code>std::ref不允许使用临时的,以避免类似这样的错误。否则,它将是一个悬空引用。
i
,另一方面,只是给你回原始变量,所以你可以很好地引用它。
但是,你不能把< code>i和< code> i这样紧挨着放;这两个表达式相对于彼此是不确定顺序的。不惜一切代价避免这种代码。