在C++中,"var << ifstream"与"ifstream >> var"相同吗?

In C++, is `var << ifstream` the same as `ifstream >> var`?

本文关键字:ifstream gt lt var C++      更新时间:2023-10-16

var << ifstreamifstream >> var一样吗?

据我所知,它们应该完全相同。但是已经很晚了,我的大脑半睡半醒,所以我想澄清一下。

它们不一样。 foo << barfoo.operator<<(bar)operator<<(foo, bar),而bar >> foobar.operator>>(foo)operator>>(bar, foo)

它们只是不同的东西。这些版本是否存在,更不用说如果存在两个版本,它们是否执行相同的操作,完全取决于代码中的内容。

对于标准 iostream,通常只为某些用户定义的类型T定义了以下两个自由函数,而没有其他函数:

std::ostream & operator<<(std::ostream &, T const &);  // for "os << x"
std::istream & operator>>(std::istream &, T &);        // for "is >> y"

No. 它们调用完全不同的函数。 一个叫operator >>,另一个叫operator <<。 此外,两者的论点不同。

这类似于询问F(int,double)是否与称呼Q(double, int)相同 - 也许,也许不是 - 尽管我可以看到为什么这对刚接触该语言的人来说不是很明显。 您首先需要意识到重载运算符没有什么特别的,它们只是函数调用。

除非var定义了<<运算符或将其定义为自由函数,否则前者无效。

不,这不是一回事。约定是流参数始终位于<< >>运算符的左侧,要读取/写入的值位于右侧。这有一个很好的理由:这些运算符可以像

std::cout << "Hello" << ',' << " world";

(它的工作原理类似于 istream s)这里发生了什么:<<运算符是左关联的,所以我们有

((std::cout << "Hello") << ',') << " world";

类型在哪里

std::cout                         :   std::ostream
(std::cout << "Hello")            :   std::ostream
((std::cout << "Hello") << ',')   :   std::ostream

因此,每次调用一个operator<<(stream, value),都会给出所需的结果。现在你想要的是扭转整个事情,比如

" world" >> ',' >> "Hello" >> std::cout;

乍一看,它应该做同样的事情。但它没有,因为这现在解析

((" world" >> ',') >> "Hello") >> std::cout;

你从operator>>(const char*, char)开始的地方.现在这个运算符如何知道结果最终会放在std::ostream中?

这里有一个小提示,表明两个表达式并不相同。运算符也可以通过非常丑陋的语法调用。亲眼看看:

var << ifstream;

等于

var.operator<<(ifstream);

ifstream >> var;

等于

ifstream.operator>>(var);

编辑:在下面的评论提醒之后 - 还有第三种选择。 运算符>>也可以实现为函数:

returntype operator>>(ifstream, var);
returntype operator>>(var, ifstream);

由于签名不匹配,因此它们的实现方式可能不同。

马蒂亚斯。

所有

需要做的是查看ifstream的文档,并查看仅定义了operator>>