是否由C++标准保证std :: basic_string :: npos + 1 == 0?

dot*_*mag 4 c++

我正在寻找消除算法中的特殊情况,为了做到这一点,我想确定它std::string::npos + 10.

在我测试的所有实现中都是如此,并且在标准中搜索我发现了以下内容:

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.这应该在通用实现上生成完全相同的代码,但保证对所有人都有效.