提问者:小点点

为什么我要使用删除的函数‘void 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;
}

例如,如果我像这样使用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,所以我无法理解为什么会得到如此不同的答案。


共1个答案

匿名用户

< code>std::ref接受一个变量,并给出一个类似于该变量的引用。

i 不是一个变量;这是暂时的。这是因为增量后的工作方式;原始值递增,但表达式的计算结果为旧值,并且需要临时值来保存该旧值,以便您可以读取它。

< code>std::ref不允许使用临时的,以避免类似这样的错误。否则,它将是一个悬空引用。

i,另一方面,只是给你回原始变量,所以你可以很好地引用它。

但是,你不能把< code>i和< code> i这样紧挨着放;这两个表达式相对于彼此是不确定顺序的。不惜一切代价避免这种代码。