2016-09-12 2 views
2

Мы знаем, что после привязки объекта к ссылке мы не можем переустановить другой объект к этой ссылке. Но в приведенном ниже диапазоне for оператор, эта же ссылка привязывается к различным объектам или элементам последовательно.Как эта же ссылка связывает разные объекты?

std::string s; 
for(auto &i:s) 
{/*each character is referred sequentially*/ 
} 

Как это возможно?

+4

Я рекомендую, например, [этот диапазон для справки] (http://en.cppreference.com/w/cpp/language/range-for). Обратите особое внимание на детали реализации. –

ответ

5

та же ссылка связывается с различными объектами

Это не та же ссылка. Ссылка i (а не объект, на который она указывает) разрушается и конструируется снова на каждой итерации цикла, поэтому они являются разными ссылками. См. Также комментарий Дэвида ниже.

+8

Ничего не отличается от 'for (int i = 0; i <10; ++ i) {int & j = func (i); ...} '. Каждая итерация цикла, 'j', является новой ссылкой. –

0

Но в приведенном ниже диапазоне для оператора одна и та же ссылка привязывается к различным объектам или элементам последовательно.

Нет, это не так.

Посмотрите на это:

void foo() 
{ 
    int x = 1; 
} 

void bar() 
{ 
    int x = 2; 
} 

Два x s различные переменные, не так ли?

То же самое относится к i в вашей петле. Это просто, как это определено для работы. Вы не пишете старомодный for (int i = 0; i < N; i++) здесь.

Смежные вопросы