关于获取cin参考的初学者问题

时间:2010-05-31 16:32:14

标签: c++

我在缠绕这个问题时遇到了问题。我有一个功能

void foo(istream& input) {
     input = cin;
}

这失败了(我假设因为cin不应该是“可复制的”。

然而,这是有效的

void foo(istream& input) {
    istream& baz = cin;
}

我是否有理由在baz中获得cin的引用,但我无法将其分配给输入?

由于

4 个答案:

答案 0 :(得分:2)

此语法:

void foo(istream& input) {
     input = cin;
}

不创建参考。它会调用operator=来复制周围的东西 但是这个语法:

void foo(istream& input) {
    istream& baz = cin;
}

定义一个新的引用变量。

关键是在C ++中,一旦你声明它就不能改变它 声明之后,引用的行为就像它是引用自身的对象一样。因此,在其上使用operator=会尝试复制到其中。

答案 1 :(得分:1)

这是完全合理的。

克隆内容并为其创建别名是不同的操作。

答案 2 :(得分:0)

& (reference)实际上是名称别名,因此您所做的所有更改都是在您引用的对象上完成的。

因此,第一块代码失败了,因为您直接使用了别名流,其中包含一个无法访问的(私有)operator=

您的第二块代码实际上意味着您正在创建另一个名称别名,因此它是有效的。

答案 3 :(得分:0)

必须初始化参考,但不能分配。不幸的是,初始化和赋值(can)都使用=,因此并不总是很明显哪个是哪个。在这种情况下,差异是至关重要的。

执行istream& baz = cin;时,您正在初始化引用,但对istream本身无效。执行input = cin;时,初始化,因为此时input已初始化。这留下了另一种可能性:分配。但是,由于您无法分配给引用本身,因此它被解释为尝试将cin分配给input引用的流。由于无法分配流,因此编译器拒绝该流。