Почему я использую удаленную функцию void std :: ref (const _Tp & 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;
}

Например, если я использую 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поэтому я не могу понять, почему я получаю такие разные ответы.

3

Решение

std::ref берет переменную и дает вам что-то, что действует как ссылка на эту переменную.

i++ не является переменной; это временно. Это из-за того, как работает постинкремент; исходное значение увеличивается, но выражение оценивается как старый значение, и временное требуется для хранения этого старого значения, чтобы вы могли прочитать его.

std::ref не позволяет использовать временный, чтобы избежать ошибок, подобных этой. В противном случае это была бы свисающая ссылка.

++iс другой стороны, просто возвращает вам исходную переменную, так что вы можете просто взять ссылку на нее.

Тем не менее, вы не можете поставить i а также ++i прямо рядом друг с другом, как это; два выражения неопределенно упорядочены (или что-то в этом роде) по отношению друг к другу. Избегайте такого рода кода любой ценой.

7

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector