我希望消除算法中的特殊情况,为了做到这一点,我想确保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;
...
};
}
allocator_traits<Allocator>::size_type
被定义为无符号整数类型。
所以,我想,我的问题归结为(static_cast<T>(-1)) + 1
总是给0
无符号整数类型T吗?
答案 0 :(得分:5)
不,在无符号整数类型的最大值中加一,不能保证为零。
如果size_type
定义为unsigned short
,且int
宽于unsigned short
,则您的添加的LHS将转换为RHS,您依赖于另外在LHS的类型中进行。
更糟糕的是,但实际发生的可能性要小得多,如果unsigned short
与<{1}} 完全相同数量的值位,则添加会溢出并导致结果在未定义的行为中。
但是,您可以添加int
,并将添加结果转换回1U
。这应该在通用实现上生成完全相同的代码,但保证对所有人都有效。