我正在寻找消除算法中的特殊情况,为了做到这一点,我想确定它std::string::npos + 1是0.
在我测试的所有实现中都是如此,并且在标准中搜索我发现了以下内容:
namespace std {
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string {
// ...
typedef typename allocator_traits<Allocator>::size_type size_type;
// ...
static const size_type npos = -1;
...
};
}
Run Code Online (Sandbox Code Playgroud)
allocator_traits<Allocator>::size_type 被定义为无符号整数类型.
所以,我想,我的问题归结为是否(static_cast<T>(-1)) + 1总是给出0无符号整数类型T?
小智 5
不,无法保证将无符号整数类型的最大值加1可以得到零.
如果size_type被定义为unsigned short并且int更宽unsigned short,则您的添加的LHS将被转换为RHS,并且您依赖于在LHS类型中执行的添加.
更糟糕的是,但实际发生的可能性要小得多,如果unsigned short具有完全相同的值位数int,则添加会溢出并导致未定义的行为.
但是,你可以做的是添加1U,并将添加的结果转换回来T.这应该在通用实现上生成完全相同的代码,但保证对所有人都有效.