Как использовать std :: istreambuf_iterator для инициализации строки - PullRequest
1 голос
/ 17 апреля 2020

Итак, я пытаюсь прочитать фрагмент кода, который выглядит так:

auto runFile(const std::string &path)
{
    const std::string source = ([&]() {
        std::ifstream file(path);
        return std::string{std::istreambuf_iterator<char>{file}, std::istreambuf_iterator<char>{}};
    })();
}

Может ли кто-нибудь объяснить мне, что именно происходит в этой строке:

return std::string{std::istreambuf_iterator<char>{file}, std::istreambuf_iterator<char>{}};

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

Если бы кто-то мог объяснить мне, как в первую очередь работает istreambuf, это тоже было бы здорово!

Чем проще ответ, тем лучше, поскольку я новичок в c ++

1 Ответ

2 голосов
/ 17 апреля 2020

Построенный по умолчанию std::istreambuf_iterator известен как итератор конца потока.

Другими словами, первый передаваемый iterator указывает на действительный stream, а второй iterator передаваемый, который создан по умолчанию, представляет конец stream.

cppreference

Когда действительный std :: istreambuf_iterator достигает конца базового потока становится равным итератору конца потока. Разыменование или его приращение в дальнейшем вызывает неопределенное поведение.

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