Почему использование auto и int дает разные ответы в этом коде? - PullRequest
1 голос
/ 13 октября 2019

Я присваиваю 2 переменным значения 10. Когда я использую ref () для одной из этих переменных, используя «int», я получаю другое значение, а когда я использую «auto», я получаю другое значение.

Using auto

     int foo(10);
     auto bar = std::ref(foo);
     ++bar; 
     cout << foo << endl;
     std::cout << bar << endl << endl;

Output: 11
        11
Using int

     int boo(10);
     int jar;
     jar = std::ref(boo);
     ++jar;
     std::cout << boo << '\n';
     std::cout << jar << '\n';

Output: 10 (why does this not increment?)
        11

Ответы [ 2 ]

4 голосов
/ 13 октября 2019

Утилита std :: ref возвращает объект типа std :: reference_wrapper .

Следовательно, в вашем примере:

auto bar = std::ref(foo);

Тип bar точно будет std::reference_wrapper. Короче говоря, он будет вести себя как ссылка , поэтому эффект оператора ++bar; увеличит значение ссылочной переменной (т. Е. foo).

С другой стороныстороны, в заявлении:

int jar = std::ref(boo);

jar как тип int. Примечание : это не ссылка, а совершенно новая переменная с именем jar. При увеличении jar это не повлияет на другую переменную (foo).


Дополнительные примечания :

Ради полноты,утверждение int jar = std::ref(boo); скрывает неявное приведение. Действительно, объект std::reference_wrapper может быть неявно преобразован в T&.

2 голосов
/ 13 октября 2019

Функция std::ref создает объект std::reference_wrapper. Этот объект переносит ссылку на foo.

С помощью

auto bar = std::ref(foo);

вы в основном создаете (косвенным образом) ссылку на foo, и в этом первом примере все модификацииbar будет сделано до foo. Это эквивалентно

std::reference_wrapper<int> bar = std::ref(foo);

и ведет себя в основном как простая ссылка:

int& bar = foo;

Во втором примере вы также создаете такой объект-обертку ссылки, но затем вы берете его значение и копируетеэто в переменную jar. Ссылочный объект-обертка затем уничтожается. Все изменения в jar производятся только для самой переменной jar, а не для foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...