Как обнулить std::cin и заставить его ждать ввода?
Входная программа завершила писать и ваша получила EOF. Всё, баста карапузики. Проверяйте статус ввода и завершайтесь - больше вы данных не получите, никогда и ни при каких условиях.
Не верите? Отправьте на stdin не одну строку, а файл: выведется правильно файл, а потом посыпят пустые строки или последний токен - зависит от реализации.
Обратите внимание на слово токен - у вас разделение по пробелу будет. Что бы читать строку, используйте std::getline().
За флагами:
www.cplusplus.com/reference/ios/ios/eof
www.cplusplus.com/reference/ios/ios/fail
www.cplusplus.com/reference/ios/ios/bad
Ну а ваш код, по сути, должен стать таким:while (true) {
        std::getline(std::cin, line);
        if (!std::cin)
            break;
        std::cout << "out: " + line << std::endl;
    }
обратите внимание, что если вы сделаете так:while (std::cin) {
        std::getline(std::cin, line);
        std::cout << "out: " + line << std::endl;
    }
то вроде короче, и вроде работает, но будете постоянно выводить одну лишнюю строку (пустую или нет - от реализации), так что поверить статус стоит перед процессингом того, что получили.
Вы читаете из cin, даже не проверяя, есть ли в нем что-нибудь. Получаете пустой результат в бесконечном цикле.
Проверьте вначале его rdstate(), что ли...