为什么这个使用 ostream 的字符串会导致 stackoverflow?

Why this usage string with ostream cause stackoverflow?

我只是想知道为什么这段代码不正确?它不断调用 Foo 构造函数并在一段时间后导致堆栈溢出。

    #include <iostream>

    using namespace std;

    class Foo
    {
        std::string str;
    public:
        Foo(const string& s) : str(s)
        {
            cout << "Foo constructor" << endl;
        }  
        friend ostream& operator<<(ostream& os,const Foo& foo);
    };

    ostream& operator<<(ostream& os,const Foo& foo)
    {
        os << foo.str;
        return os;
    }

    int main()
    { 
        Foo foo{"Hello"};   
        cout << foo;    
        cin.get();
    }

我知道,我知道可以写

cout << foo.str << endl;

os << foo.str.c_str();

但是我想知道为什么会出现这个错误..

该程序使用 std::string 及其输出运算符,但 包括 header <string>:当使用 <string> 时您需要包括 header。 std::string 似乎是通过包含 <iostream> 来定义的事实是不够的。它也是不可移植的:不同的实现可能选择只声明而不定义 std::string(但是需要声明,因为一些 IOStream 成员使用类型 std::string)。

如果未找到 std::string 的输出运算符,则表达式

out << foo.str

被解释为

out << Foo(foo.str)

因为 Foo 的输出运算符。当然,这确实会导致无限递归。