【问题标题】:Why are iostream sentry objects called "cerberos" in the standard?为什么 iostream 哨兵对象在标准中称为“cerberos”?
【发布时间】:2013-03-01 23:22:17
【问题描述】:

我想知道g++libstdc++ 中的__cerb 是什么意思,我发现这似乎是官方C++ 标准文档中命名的cerberos 的简称。

§ 22.3.1 / 3:

[ 示例:iostream operator<< 可能实现为:

template <class charT, class traits>
basic_ostream<charT,traits>&
operator<< (basic_ostream<charT,traits>& s, Date d) {
                                                            //      !!!!!!!!!!
  typename basic_ostream<charT,traits>::sentry cerberos(s); // <--- !! HERE !!
                                                            //      !!!!!!!!!!
  if (cerberos) {
    ios_base::iostate err = ios_base::iostate::goodbit;
    tm tmbuf; d.extract(tmbuf);
    use_facet<time_put<charT,ostreambuf_iterator<charT,traits> > >(
      s.getloc()).put(s, s, s.fill(), err, &tmbuf, ’x’);
    s.setstate(err);            // might throw
  }
  return s;
}

—结束示例]

为什么将 iostream sentry 对象称为 cerberoscerberos 究竟是什么意思?

【问题讨论】:

  • 所以只是守卫的通用名称?为什么 cerber o s?
  • 使用这个名字的人一定非常高兴。

标签: c++ iostream naming naming-conventions


【解决方案1】:

Cerberus was the three headed dog1 who guarded the gates of hell,防止被困在其中的人越过冥河。写该部分的人喜欢希腊和/或罗马神话,并认为这将是局部变量哨兵的适用名称。

至于为什么以os结尾,可以想象三种情况:

  1. 他们完全忘记了希腊语和拉丁语名词偏角的规则,并认为这就是它的拼写方式
  2. 我完全忘记了希腊语和拉丁语名词偏角的规则,我指出了一个不存在的问题。
  3. 他们将 Cerberus 和 Kerberos 的拼写混为一谈,从而诞生了 Cerberos 希腊和罗马血统的 basic_stream 哨兵。

1。显然 Cerberus 上的正面数量是可变的。或许这更好地表达为 “N 头狗,其中 N 大于或等于 1。”

【讨论】:

  • 或者可能是 3。他们混合了拉丁和希腊名称,KerberosCerberus
  • 或4,操作系统是对他们正在编写ostream的事实的引用。
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 2014-08-07
  • 2017-01-11
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多