Повторное использование той же строки перед вставкой в ​​список, кажется, проходит по значению? - PullRequest
1 голос
/ 24 ноября 2010
list<string> l;
string s;

getline(cin, s);
l.push_back(s);
getline(cin, s);
l.push_back(s);

Использование ввода

123
test

Печать списка результатов 'l':

123
test

Не должен ли этот отпечаток:

test
test

Меня немного смущает вопрос, почему строка передается по значению.

Ответы [ 4 ]

1 голос
/ 24 ноября 2010

push_back копирует строковый объект s, переданный в него.Таким образом, какое бы изменение вы ни делали для s, оно не влияет на значение возврата.

1 голос
/ 24 ноября 2010

Не должно быть, потому что строка копируется, когда вы добавляете ее в список l. string аргумент - , переданный по ссылке на getline :

istream& getline ( istream& is, string& str );
0 голосов
/ 24 ноября 2010

псевдокод:

void list::push_back(string& s)
{
   list_.add(new string(s));   // copy string
}

Видите ли, строка копируется методом push_back. Он передается по ссылке, чтобы избежать избыточного копирования.

void list::push_back(string s) // copy string
{
   list_.add(new string(s));   // copy string
}
0 голосов
/ 24 ноября 2010

Ваш заголовок вводит в заблуждение; у вас нет нигде в коде, который вы опубликовали.

Строка передается по значению в push_back, что делает копию в list. Результаты, которые вы получаете, - это именно то, чего я ожидал.

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