为什么C++ iostream总是左手分配?

gwg*_*gwg 23 c++ iostream

我正在学习C++并且从未处理过流.我原以为表示符号是:

std::cout << "foo";
char foo << std::cin;
Run Code Online (Sandbox Code Playgroud)

我确信这是一个很好的理由std::cin >> foo.它是什么?

use*_*003 39

它与<<和>>运算符的关联性有关.

它们最初只用于在它们保持联想的位移.重载时运算符关联性保持不变(否则,代码将无法解析):

如果你这样做了

 int a, b ;
 a << b << cin
Run Code Online (Sandbox Code Playgroud)

你会得到的

(a << b) << cin
Run Code Online (Sandbox Code Playgroud)

有点移位和输入

这就是标准库以它的方式实现的原因.

  • 这里提出的要点是流是库的一部分,而不是基本语言,因此语言不支持具有完全匹配语义的语法的唯一运算符.`<<`实际上实际上是位移运算符的重载,而不仅仅是以两种不同方式使用的语言特性. (14认同)

Man*_*rse 13

a << b并且a >> b只是简称:

operator<<(a,b)
Run Code Online (Sandbox Code Playgroud)

operator>>(a,b)
Run Code Online (Sandbox Code Playgroud)

(或成员 - 功能等价物).

也就是说,它们只是对特定功能的调用.只是碰巧C++标准库重载operator<<以执行输出流到ostreams,并operator>>istreams 执行输入流.

这些函数仅重载以使流在左侧.

这个决定有两个原因.第一个是符号上的简单(即,由于订购的操作数的只有一条路,有关于任何特定代码的含义更加明确,并有少扩展标准库何时实现不同的重载的数量巨大需求支持额外的课程).第二个是那个<<并且>>是左联想的,所以:

int a, b;
a << b << cin;
Run Code Online (Sandbox Code Playgroud)

会成为:

(a << b) << cin;
Run Code Online (Sandbox Code Playgroud)

而:

int a, b;
cin >> b >> a;
Run Code Online (Sandbox Code Playgroud)

正确地变成:

(cin >> b) >> a;
Run Code Online (Sandbox Code Playgroud)