为什么我使用删除的函数'void std :: ref(const _Tp&&)[with _Tp = int]'

时间:2017-02-24 10:54:53

标签: c++ c++11 move-constructor deleted-functions

#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,所以我无法理解为什么会得到如此不同的答案。

1 个答案:

答案 0 :(得分:8)

std::ref接受一个变量,并为您提供类似于对该变量的引用的内容。

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

std::ref不允许你使用临时的,以避免像这样的错误。否则,这将是一个悬垂的参考。

另一方面,

++i只是让你回原始变量,所以你可以参考那个就好了。

但是,您不能将i++i放在彼此旁边;这两个表达式相对于彼此是不确定地排序(或者某种东西)。不惜一切代价避免使用这种代码。