我在缠绕这个问题时遇到了问题。我有一个功能
void foo(istream& input) {
input = cin;
}
这失败了(我假设因为cin不应该是“可复制的”。
然而,这是有效的
void foo(istream& input) {
istream& baz = cin;
}
我是否有理由在baz中获得cin的引用,但我无法将其分配给输入?
由于
答案 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
引用的流。由于无法分配流,因此编译器拒绝该流。