c++ - 重载 << 运算符和递归

标签 c++ recursion operator-overloading cout ostream

我尝试了以下代码:

#include <iostream>
using std::cout;
using std::ostream;

class X
{
public:
    friend ostream& operator<<(ostream &os, const X& obj) 
    {
        cout << "hehe";          // comment this and infinite loop is gone
        return (os << obj);
    }
};

int main()
{
    X x;
    cout << x;
    return 0;
}

当我编译并运行它时,它符合预期;一个无限循环。如果我删除友元函数中的 cout 语句,递归就不会发生。为什么会这样?

最佳答案

Optimizer 决定您所有剩余的事件都没有效果,并将其优化掉。 对与错是另一回事。

特别是:

X x;

创建空对象“x”

cout << x;

调用:

return (os << obj);

追加空对象;编译器注意到自上次调用以来“os”没有增长,并且没有显示任何进一步这样做的 promise (并且没有其他任何事情发生)所以它决定整个业务是多余的并且可以在此时被截断。

万一你打电话

    cout << "hehe";          // comment this and infinite loop is gone

有一些额外的事件,因此优化器不会删除以下调用。

我想如果你初始化了 x任何非空的,或执行除 cout << "hehe"; 以外的任何非空事件,你会以同样的方式运行递归。

关于c++ - 重载 << 运算符和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2355273/

相关文章:

c++ - 使用 strtok() 进行错误的字符串比较

PHP 数组 : join each sub-array together (Probability)

c - 删除链表时输出错误

c++ - 如何在 VS 2012 和 g++ 中获得 64 位长

c++ - Intel Inspector XE 2012 警告 #12367 - 传递给 vector::erase() 的迭代器参数切片

python - 在python中递归展平嵌套列表

C++ - 重载 [] 运算符

c++ - 创建类索引器 operator[] 允许字符串参数(字符串索引)

c++ - 重载输入/输出运算符,为什么它以这种方式工作而不是另一种方式?

c++ - 尝试使用 boost asio PUT 时出现 Amazon S3 403 错误