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

hel*_*ami 8 c++ naming iostream 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;
}
Run Code Online (Sandbox Code Playgroud)

- 结束例子]

为什么sentry调用iostream 对象cerberos,cerberos实际意味着什么?

use*_*116 12

塞伯鲁斯是三头狗1,守护着地狱之门,让那些被困在里面的人不再穿过冥河.谁写了这一部分想象希腊和/或罗马神话,并决定它将是一个适用于当地变量哨兵的名称.

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

  1. 他们完全忘记了希腊语和拉丁语名词倾斜的规则,并认为它是如何拼写的
  2. 我完全忘记了希腊语和拉丁语名词倾斜的规则,并指出一个非问题.
  3. 他们混淆了Cerberus和Kerberos的拼写,生下了Cerberos希腊和罗马血统的基本哨兵.

显然,塞伯鲁斯的头数是多变的.也许这更好地表达为"N头狗,其中N大于或等于1".

  • 或者4,os是他们写ostream的事实的参考. (5认同)