Проблема при использовании потоков std::ws и десинхронизации

#c #std

Вопрос:

Я изучаю C и столкнулся с проблемой, связанной с использованием std::ws в следующем коде:

 #include <iostream>
#include <string>

int main()
{
    std::ios_base::sync_with_stdio(false);

    std::string s1 {};
    std::string s2 {};

    std::cout << "Enter s1: ";
    std::getline(std::cin >> std::ws, s1);
    std::cout << "Enter s2: ";
    std::getline(std::cin, s2);

    std::cout << "s1: " << s1 << 'n';
    std::cout << "s2: " << s2 << 'n';

    return 0;
}
 

Как есть, код запрашивает ввод s1 до "Enter s1: " того, как на экране появится приглашение. Удаление std::ws позволяет распечатать приглашение. В качестве альтернативы удаление std::ios_base::sync_with_stdio(false) также приводит к ожидаемому поведению, с или без std::ws .

Мне кажется, что между этими двумя функциями происходит какое-то взаимодействие, но я не уверен, почему это так. Я не использовал никаких функций ввода-вывода C, поэтому я не понимаю, почему отмена синхронизации потоков может вызвать проблему. Может кто-нибудь объяснить?

Комментарии:

1. produces the expected behaviour Каково ожидаемое поведение? И когда — с или без std::ws и с или без sync_with_stdio ?

2.Может быть, это «…Если синхронизация отключена, стандартным потокам C разрешается буферизировать свои операции ввода-вывода независимо…» en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio ie std::cout << "Enter s1: "; все еще находится в выходном буфере и не был сброшен на консоль.

3. @KamilCuk Я имел в виду, что печать выполняется в правильном порядке.

4. По умолчанию любое чтение std::cin должно быть std::cout сначала сброшено. Так что не должно иметь значения, std::ws используется он или нет. en.cppreference.com/w/cpp/io/cout : » После инициализации std::cout привязывается () к std::cin, а std::wcout привязывается () к std::wcin, что означает, что любая операция ввода в std::cin выполняет std::cout. flush() (через конструктор std::basic_istream::sentry) . »

5. @RemyLebeau Что-то, кажется, останавливает это поведение здесь, отсюда и вопрос.