Почему он принимает поток и строку по ссылке в качестве аргументов, только чтобы вернуть тот же поток, который был передан?
В библиотеке потоков есть общий шаблон длясделай это.Это означает, что вы можете проверить выполняемую операцию во время ее выполнения.Например:
std::string line;
while(std::getline(std::cin, line))
{
// use line here because we know the read succeeded
}
Вы также можете создавать сжатые парсеры с помощью «цепочки» потоковых функций:
std :: string key, value;
if(std::getline(std::getline(in, key, '='), value))
my_map[key] = value;
Кажется более интуитивно понятным - принимать поток как аргумент, а затем возвращать прочитанную строку.
Проблема с возвратом новой строки при каждом вызове состоит в том, что вы постоянно выделяете для них новую память вместо того, чтобы повторно использовать память, уже выделенную для строки, которую вы передали, или ту, которая была получена при повторении цикла.
// Here line will not need to allocate memory every time
// through the loop. Only when it finds a longer line than
// it has capacity for:
std::string line;
while(std::getline(std::cin, line))
{
// use line here because we know the read succeeded
}