文档中,基本都是如此定义了bitset的一个ctor:
bitset(
const basic_string<CharType, Traits, Allocator>& _Str,
typename basic_string<CharType, Traits, Allocator>::size_type
_Pos = 0,
typename basic_string<CharType, Traits, Allocator>::size_type
_Count = basic_string<CharType, Traits, Alloc>::npos
);
在vc71和sltport中,源代码里面根本就没有这个定义,取而代之的,是两个函数,下面是vc71的代码:
explicit bitset(const basic_string<_Elem, _Tr, _Alloc>& _Str,
_BITSET_SIZE_TYPE _Pos = 0)
{ // construct from [_Pos, ...) elements in string
_Construct(_Str, _Pos, basic_string<_Elem, _Tr, _Alloc>::npos);
}
explicit bitset(const basic_string<_Elem, _Tr, _Alloc>& _Str,
_BITSET_SIZE_TYPE _Pos,
_BITSET_SIZE_TYPE _Count)
{ // construct from [_Pos, _Pos + _Count) elements in string
_Construct(_Str, _Pos, _Count);
}
这也许不是什么问题。
不过,下面这个也许会是个问题:
if (_Str[--_Pos] == '1')
set(_Num);
else if (_Str[_Pos] != '0')
_Xinv();
因为根据ctor的定义,我有可能传进来一个wstring的函数,那样的话就玩了。
stl也好,其他的C++库也好,在wide character方面往往出现漏洞,这是因为他们一般不会用到的原因。为什么我们就不能去修补这些错误呢?