将std :: cin直接重定向到std :: cout

Jos*_*_mr 2 c++ io

关于标准io的练习要求我:

读取标准输入的输入并将其写入标准输出.

可能的解决方案是:

#include<iostream>
#include<string>

using std::cin; using std::cout;
using std::string;

int main()
{
    string word;
    while (cin >> word)
        cout << word;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,字符串充当缓冲区.如果有人试图通过执行以下操作来摆脱缓冲区:

#include<iostream>
using std::cin; using std::cout;

int main()
{
    while (cout << cin)
        ;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果非常不同.当我运行这段代码时,我得到一个无休止的流

0x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d30

在终端上.

为什么会这样?为什么这些程序的行为有所不同?

Dre*_*ann 5

cout << cin不会按你想要的方式工作.在C++ 11及更高版本中,它甚至不会编译.

你看到了(现在过时的)"安全布尔"成语的不幸副作用.

在C++ 11之前,a std::istream 可以隐式转换为a void*来模拟bool语义. (从C++ 11开始,explicit operator bool() const填充该角色)

因此,代码:

while (cout << cin)
Run Code Online (Sandbox Code Playgroud)

在C++ 98或C++ 03中编译,因为它可以隐式转换为:

while (cout << static_cast<void*>(cin) )
Run Code Online (Sandbox Code Playgroud)

void*cin未处于错误状态时,允许此转换生成任何非NULL .在你的情况下,它正在生成指针0x600d30.