Overloaded ostream operator segmentation fault if no endl

c++, operator-overloading, ostream, vector

Solution

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

is not manadatory. The segfault is caused because you are not returning `os`

ostream& operator << (ostream &os, const foo &f) {
    for (int i = 0; i < f.a.size(); ++i)
        os << f.a[i] << " ";
    return os; // Here
}

it is undefined behavior if you don't return the ostream. The `endl` is flushing your `os` here. That's why it seems like it is working.

EDIT: Why it is working in this case according to Bo Persson

The os << endl; is another operator call that actually returns os by placing it "where a return value is expected" (likely a register). When the code returns another level to main, the reference to os is still there

Problem

``` 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; } ``` In the above code, if the marked line is removed, there will be a segment fault error, can someone explain why?

Original source