为什么标准中的iostream哨兵对象称为“cerberos”?

时间:2013-03-01 23:22:18

标签: c++ iostream naming naming-conventions

我想知道__cerb libstdc++g++的含义是什么,我发现这似乎是cerberos的一个简称,正如官方所说的那样C ++标准文档。

§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实际上是什么意思?

1 个答案:

答案 0 :(得分:12)

Cerberus was the three headed dog1 who guarded the gates of hell,让陷入困境的人不要越过Styx河。谁写了这一部分想象希腊和/或罗马神话,并决定它将是一个适用于当地变量哨兵的名称。

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

  1. 他们完全忘记了希腊语和拉丁语名词倾斜的规则,并认为这是拼写的方式
  2. 我完全忘记了希腊语和拉丁语名词倾斜的规则,并且指出了一个非问题。
  3. 他们混淆了Cerberus和Kerberos的拼写,生下了Cerberos希腊和罗马血统的基本哨兵。
  4. <子> 1。显然,Cerberus的头数是多变的。也许这更好地表达为“N头狗,其中N大于或等于1.”