为什么这段代码没有产生预期的输出?

Why is this code not producing expected output?

#include<iostream>

using namespace std;

#define sp ' '

std::ostream& nl(std::ostream os)
{
    return os << '\n';
}



int main()
{
    cout << 1 << sp << 2 << nl;
    cout << 3 << sp << 4 << sp;
    cin.get();
    cout << 5 << sp << 6 << nl;
    cin.get();
    cout << 7 << sp << 8;

    return 0;
}

我正在测试我自己的流操纵器,它添加换行符但不刷新。 我期望在程序结束之前没有输出,因为 cout 应该只在程序结束时 flush 而没有 endl。而且我期望输出为

1 2
3 4
// newline added here and cin.get() executed adding another newline
5 6
// newline added here and cin.get() executed adding another newline
7 8

但是我得到了这个。

1 2007818983 4  // cin.get() executed here in this line
5 600781898 //cin.get() executed here again
7 8

这是为什么?在 Visual Studio 2019 年的调试期间,有什么方法可以查看调试器中的 cout、cin 或任何流的缓冲区,以了解发生了什么?

问题出在 nl 函数中。您必须通过引用传递 ostream。看看这段代码

// Pass by Ref 
std::ostream& nl(std::ostream& os){
  os << '\n';
  return os;
}