0

ヘッダー ファイルでわかるように<xiosbase>、クラスios_baseは から派生しtemplate <class Dummy> class _Iosb、次のstatic const variablesものが定義されています。

 static const _Fmtflags skipws = (_Fmtflags)_IOSskipws;
 static const _Fmtflags unitbuf = (_Fmtflags)_IOSunitbuf;
 static const _Fmtflags uppercase = (_Fmtflags)_IOSuppercase;
 static const _Fmtflags showbase = (_Fmtflags)_IOSshowbase;
 static const _Fmtflags showpoint = (_Fmtflags)_IOSshowpoint;
 static const _Fmtflags showpos = (_Fmtflags)_IOSshowpos;
 static const _Fmtflags left = (_Fmtflags)_IOSleft;
 static const _Fmtflags right = (_Fmtflags)_IOSright;
 static const _Fmtflags internal = (_Fmtflags)_IOSinternal;
 static const _Fmtflags dec = (_Fmtflags)_IOSdec;
 static const _Fmtflags oct = (_Fmtflags)_IOSoct;
 static const _Fmtflags hex = (_Fmtflags)_IOShex;
 static const _Fmtflags scientific = (_Fmtflags)_IOSscientific;
 static const _Fmtflags fixed = (_Fmtflags)_IOSfixed;

これらのフラグをメンバー関数 ios_base::setf() で変更できるのはなぜですか? それらは一定ではありませんか?

4

2 に答える 2

1

GCCの実装をios_base:setf調べると、このようになります

バージョンのみ追加

   inline fmtflags              
    setf(fmtflags __fmtfl)       
    {                            
      fmtflags __old = _M_flags; 
      _M_flags |= __fmtfl;       
      return __old;              
    } 

バージョンの追加/削除

inline fmtflags                           
setf(fmtflags __fmtfl, fmtflags __mask)   
{                                         
  fmtflags __old = _M_flags;              
  _M_flags &= ~__mask;                    
  _M_flags |= (__fmtfl & __mask);         
  return __old;                           
}                                         

つまり、メンバー変数を変更します_M_flags

あなたが見ている static const 変数は、この変数の便利な事前定義された値です。

于 2012-12-31T12:15:46.503 に答える
0

答えは、これらのメンバー変更されていないということです。setf非 const メンバーを設定します (おそらく非公開/保護)。おそらく、関連するヘッダーを調べて、実装が何を行っているかを正確に知ることができます。

于 2012-12-31T12:10:26.877 に答える