3
#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&&) [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,所以我不明白为什么我会得到如此不同的答案。

4

1 回答 1

10

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

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

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

++i,另一方面,只是给你原来的变量,所以你可以引用它就好了。

但是,您不能像这样将i和放在++i一起;这两个表达式相对于彼此的顺序是不确定的(或某事)。不惜一切代价避免这种代码。

于 2017-02-24T12:01:52.333 回答