Утилита 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&
.