вектор :: по ссылке - PullRequest
       4

вектор :: по ссылке

2 голосов
/ 06 февраля 2011

Учитывая это определение:

vector<some_struct_t> lots_of_stuff;

И тот факт, что vector::at возвращает ссылку, этот код имеет смысл для меня:

some_struct_t & ref_element = lots_of_stuff.at(0);

Но этот код также компилируется и, кажется, работает:

some_struct_t val_element = lots_of_stuff.at(0);

Как здесь может работать нереференс? Вызывается ли конструктор копирования? Почему это работает?

Ответы [ 2 ]

6 голосов
/ 06 февраля 2011

Не ссылающийся делает копию из возвращенной ссылки на ваш объект. Изменения в вашем объекте не будут применены к объекту в векторе, как это делает эталонная версия.

0 голосов
/ 06 февраля 2011

Ссылка типа T - это просто выражение lvalue типа T, точно так же, как имя переменной типа T - это выражение lvalue T. Итак, ...

vector<T> v = ...;
T a = ...;
T b = a;
T c = v.at(0);

есть небольшая разница между инициализацией b и c, потому что с правой стороны это просто lvalue-выражение типа T, и это приводит к инициализации копирования.

Я думаю, что причина, по которой вы задаете этот вопрос, заключается в том, что вы думаете, что ссылка сама по себе является типом объекта, так же как тип указателя является типом объекта. Но это не так. Выражения никогда не имеют ссылочного типа. Ссылочные типы просто используются для превращения rvalue в выражения lvalue. Тип выражений одинаков. Но его «категория стоимости» меняется.

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