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

时间:2014-10-16 11:12:42

标签: 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;
    ...
  };
}

allocator_traits<Allocator>::size_type被定义为无符号整数类型。

所以,我想,我的问题归结为(static_cast<T>(-1)) + 1总是给0无符号整数类型T吗?

1 个答案:

答案 0 :(得分:5)

不,在无符号整数类型的最大值中加一,不能保证为零。

如果size_type定义为unsigned short,且int宽于unsigned short,则您的添加的LHS将转换为RHS,您依赖于另外在LHS的类型中进行。

更糟糕的是,但实际发生的可能性要小得多,如果unsigned short 与<{1}} 完全相同数量的值位,则添加会溢出并导致结果在未定义的行为中。

但是,您可以添加int,并将添加结果转换回1U。这应该在通用实现上生成完全相同的代码,但保证对所有人都有效。