7
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;
}

在上面的代码中,如果把标记的行去掉,就会出现段错误错误,有人能解释一下为什么吗?

4

1 回答 1

18
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 的说法,为什么它在这种情况下有效

操作系统 << endl; 是另一个运算符调用,它通过将 os 放置在“预期返回值的位置”(可能是寄存器)来实际返回 os。当代码返回另一个级别到main时,对os的引用仍然存在

于 2013-04-03T13:33:04.807 回答