【问题标题】:What's the difference between cout<<cout and cout<<&cout in c++?c++ 中的 cout<<cout 和 cout<<&cout 有什么区别?
【发布时间】:2011-09-20 17:17:51
【问题描述】:

这可能是一个初学者问题,理解 cout 的工作原理可能是这里的关键。如果有人可以链接到一个很好的解释,那就太好了。 cout&lt;&lt;cout 和 cout&lt;&lt;&amp;cout 在 linux x86 机器上打印以 4 分隔的十六进制值。

【问题讨论】:

  • 这里是一个人的例子。 ideone.com/0FZXZ
  • 问题究竟是什么是?
  • 你为什么要问这个。这个问题没有任何意义,他们这样做是没有逻辑的。
  • @Tux-D:我为什么问它:我在某处看到了这个成语,这让我很困惑。我理解为什么 cout
  • @DanielA.White:什么都没有。

标签: c++ cout


【解决方案1】:

cout &lt;&lt; cout 等价于cout &lt;&lt; cout.operator void *()。这是C++11之前用来判断一个iostream是否处于故障状态的习语,在std::ios_base中实现;它通常返回static_cast&lt;std::ios_base *&gt;(&amp;cout) 的地址。

cout &lt;&lt; &amp;cout 打印出cout 的地址。

由于std::ios_base 是cout 的虚拟基类,它不一定与cout 相邻。这就是它打印不同地址的原因。

【讨论】:

    【解决方案2】:

    cout &lt;&lt; cout 正在使用为布尔测试目的而存在的到 void* 的内置转换。由于某些无趣的原因,您的实现使用了一个地址,该地址是 std::cout 对象的 4 个字节。在 C++11 中,此转换已被删除,因此不应编译。

    cout &lt;&lt; &amp;cout 正在打印std::cout 对象的地址。

    【讨论】:

      【解决方案3】:

      cout &lt;&lt; &amp;cout 将cout 传递给cout 的地址。

      cout &lt;&lt; cout 正在使用 operator void* 打印将 cout 隐式转换为 void* 指针的值。

      【讨论】:

      • 我删除了链接,因为我找不到合适的替代品。谢谢
      【解决方案4】:

      如前所述,cout &lt;&lt; cout 使用为布尔测试提供的void* 转换(while (some_stream){ ... } 等)

      它打印值 &cout + 4 因为转换是在基本实现中完成的,并转换为它自己的类型,这是from libstdc++:

      operator void*() const
      { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
      

      【讨论】:

        【解决方案5】:

        cout&lt;&lt;&amp;cout 正在将cout 的地址传递给流。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-22
          • 2013-03-24
          • 2015-11-27
          • 2021-07-26
          • 2012-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多