Как использовать конструктор stringstream в getline?

После qaru.site/info/35331/...

Почему я не могу использовать

getline(stringstream(line),cell,','){}

вместо

stringstream lineStream(line); 
getline(lineStream,cell,','){}

?

Обновление

Я должен был уточнить, что хочу использовать getline в цикле.

Кроме того, я должен был также отметить, что мое первоначальное намерение состояло в том, чтобы прочитать файл по строкам, используя getline, и использовать строку из этой строки в новой линии getline, которая будет делить на ',', что более интуитивно понятное imo.

Из того, что я понял до сих пор, getline не предназначен для этого, потому что он принимает неконстантный вход и дает токен const; поэтому getline не может быть слепо рекурсивно.

Ответ 1

Как показывают @James Kanze, вы можете.

Вопрос: вы действительно хотите?
Поток уничтожается в конце выражения, поэтому вы читаете только одну ячейку из него.

Если мы посмотрим на это в контексте исходного вопроса:
т.е. вы не можете использовать это в цикле:

std::string       line = /* Init */;
std::stringstream lineStream(line); 

std::string cell;
while(std::getline(lineStream, cell, ','))
{
    // Do stuff with cell.
}

Если вы разместите свой код в этом контексте, он не будет работать должным образом:

std::string cell;
while(std::getline(std::istringstream(line).flush(), cell, ','))
{
    // Do stuff with cell.
}

Поскольку выражение внутри while() будет полностью оцениваться каждый раз. Таким образом, вы переходите в непрерывный цикл, непрерывно читающий первую ячейку.

Ответ 2

Вы можете, но это уродливо:

std::getline( std::istringstream( line ).flush(), cell, ',' );

Проблема заключается в том, что std::getline принимает неконстантную ссылку (которая логично, поскольку он собирается изменить поток), и вы не можете инициализировать неконстантную ссылку с временным. Вы можете, однако, функции вызова на нем. std::istream::flush является членом функция, которая возвращает неконстантную ссылку на поток, на котором он (и если этот поток является std::istringstream, он не делает все остальное).

FWIW: вы, вероятно, найдете:

cell = std::string( line.cbegin(), std::find( line.cbegin(), line.cend(), ',' ) );

немного эффективнее. И, по крайней мере, на мой взгляд, легче читать и обслуживание.