This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
_M_fill initialization in basic_ios::init
- From: Richard Burkert <rrburkert at pobox dot com>
- To: libstdc++ at gcc dot gnu dot org
- Date: Sun, 02 Dec 2001 03:24:47 +0000
- Subject: _M_fill initialization in basic_ios::init
Hi,
Here's basic_ios::init from basic_ios.tcc for reference...
template<typename _CharT, typename _Traits>
void
basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
{
// NB: This may be called more than once on the same object.
ios_base::_M_init();
_M_cache_facets(_M_ios_locale);
_M_tie = 0;
_M_fill = this->widen(' ');
_M_exception = goodbit;
_M_streambuf = __sb;
_M_streambuf_state = __sb ? goodbit : badbit;
}
See how _M_fill is initialized unconditionally. But if the locale didn't
support ctype for _CharT then _M_cache_facets would skip initialization
of _M_ios_fctype and you'd have problems when widen chains into
_M_ios_fctype->widen. In such conditions formatting shouldn't be
relevant, so _M_fill wouldn't need to be initialized and you could just
stick an
if (has_facet<__ctype_type>(__M_ios_locale))
above the initialization in init, or else put the initialization inside the
similar if statement in _M_cache_facets. If you put it in _M_cache_facets
it would also get reset to something appropriate when imbue is called,
otherwise the fill character is theoretically meaningless after a call
to imbue since it remains at whatever it was with the previous locale.
I only noticed because I was segfaulting inside widen on creation of
a stream of ints i'd set up. So yes it might happen =P
Rich