class foo {
public:
friend ostream& operator << (ostream &os, const foo &f);
foo(int n) : a(n) {}
private:
vector <int> a;
};
ostream& operator << (ostream &os, const foo &f) {
for (int i = 0; i < f.a.size(); ++i)
os << f.a[i] << " ";
os << endl; // why is this line a must?
}
int main(void) {
foo f(2);
cout << f << endl;
return 0;
}
在上面的代码中,如果标记的行被删除,会出现段错误,有人可以解释一下原因吗?
答案 0 :(得分:17)
ostream& operator << (ostream &os, const foo &f) {
for (int i = 0; i < f.a.size(); ++i)
os << f.a[i] << " ";
os << endl; // why is this line a must?
}
不是躁情。由于您没有返回os
ostream& operator << (ostream &os, const foo &f) {
for (int i = 0; i < f.a.size(); ++i)
os << f.a[i] << " ";
return os; // Here
}
如果您不返回ostream,则它是未定义的行为。 endl
正在冲洗您的os
。这就是为什么它似乎正在发挥作用。
编辑:根据Bo Persson的说法,为什么它在这种情况下工作
os&lt;&lt; ENDL;是另一个实际返回os的操作符调用 将其置于“预期返回值的地方”(可能是注册)。 当代码返回另一个级别为main时,对os的引用是 还在那里