#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&&) [с _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
поэтому я не могу понять, почему я получаю такие разные ответы.
std::ref
берет переменную и дает вам что-то, что действует как ссылка на эту переменную.
i++
не является переменной; это временно. Это из-за того, как работает постинкремент; исходное значение увеличивается, но выражение оценивается как старый значение, и временное требуется для хранения этого старого значения, чтобы вы могли прочитать его.
std::ref
не позволяет использовать временный, чтобы избежать ошибок, подобных этой. В противном случае это была бы свисающая ссылка.
++i
с другой стороны, просто возвращает вам исходную переменную, так что вы можете просто взять ссылку на нее.
Тем не менее, вы не можете поставить i
а также ++i
прямо рядом друг с другом, как это; два выражения неопределенно упорядочены (или что-то в этом роде) по отношению друг к другу. Избегайте такого рода кода любой ценой.
Других решений пока нет …