#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()
,编译器会说
使用已删除的函数'void std :: ref(const _Tp&amp;&amp;)[with _Tp = int]'
但是如果我的代码是
#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
,所以我无法理解为什么会得到如此不同的答案。
答案 0 :(得分:8)
std::ref
接受一个变量,并为您提供类似于对该变量的引用的内容。
i++
不是变量;这是暂时的。那是因为后增量如何运作;原始值递增但表达式的计算结果为旧值,并且需要临时值来保存该旧值,以便您可以读取它。
std::ref
不允许你使用临时的,以避免像这样的错误。否则,这将是一个悬垂的参考。
++i
只是让你回原始变量,所以你可以参考那个就好了。
但是,您不能将i
和++i
放在彼此旁边;这两个表达式相对于彼此是不确定地排序(或者某种东西)。不惜一切代价避免使用这种代码。