std :: string :: npos == -1是否始终为真?

随机用户名

标题是相对不言自明的。我认识到与其他答案的相似之处,但是所有答案的运算符排列都不同(因此,转换规则也不同)。因此,我需要一个可以澄清这种特殊情况的答案。

如果有人可以指出标准中解释这一点的部分,我很乐意投票并接受答案。

ha

,并非总是如此。但是,乍一看它要复杂一些:

首先,让我们看看std::string(21.3 / 1):

<string>定义了basic_string用于操纵焦炭状物体和四个类型定义,的可变长度的序列类模板stringu16stringu32string,和wstring,该名称的特化basic_string<char>basic_string<char16_t>basic_string<char32_t>,和basic_string<wchar_t>,分别。

从21.4 / 5开始:

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;
// [other members omitted]
};

请注意,虽然使用npos进行了初始化-1,但其类型取决于Allocator::size_type,这意味着在没有进一步知识的情况下,我们无法简单地假设string::npos == -1它将进行编译。

现在,string使用默认分配器(毕竟模板参数在标准库提供的typedef中具有默认值),让我们检查20.6.9:

typedef size_t size_type;

现在,我们基本上可以将问题重写为:size_t(-1) == -1现在发生的情况取决于子表达式的类型:当这样写时size_t左手边显然是type ,而右手边是整数常量,它有type int(没有其他限定符)。

结果是trueifsize_t至少等于int(对于标准狂热者:具有更大的整数转换等级,如4.13所定义)。否则,左手侧将得到提升到int,导致像对比0xFFFF == -1(对于size_t作为uint16_tint具有32位),这是false

请注意,尽管16位系统本身已经不再是非常普遍的了(除了一些外形很小的残余物),int但标准并不仅限于32位。64bitsize_t和128位int目标的x86_64的编译器在技​​术上将合规。

所有引用均来自C ++ 11标准(ISO / IEC 14882:2011)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不同大小的std :: string :: npos

来自分类Dev

不同大小的std :: string :: npos

来自分类Dev

使用std :: string :: npos时出错

来自分类Dev

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

来自分类Dev

为什么我们有std :: string :: npos但没有std :: vector :: npos?

来自分类Dev

为什么“ if(unsigned int == string :: npos)”可以为真?

来自分类Dev

如何将std :: string分解为std :: string

来自分类Dev

如何将std :: string分解为std :: string

来自分类Dev

打印新行时std :: string为空

来自分类Dev

将std :: String覆盖为char *

来自分类Dev

是否可以从std :: basic_string继承?

来自分类Dev

重载char *和std :: string是否安全?

来自分类Dev

是否使用空的std :: optional <string> UB?

来自分类Dev

是否在某处定义了空的std :: string?

来自分类Dev

按值返回std :: string是否安全?

来自分类Dev

如何知道 std::string 的编码是否正确?

来自分类Dev

std :: unordered_map <std :: string,std :: function <void(std :: string&)是否只能容纳静态函数?

来自分类Dev

std :: unordered_map <std :: string,std :: function <void(std :: string&)是否只能容纳静态函数?

来自分类Dev

如果std :: is_trivial_v <T>为true,则std :: is_standard_layout_v <T>始终为真吗?

来自分类Dev

在定义期间将std :: string设置为0与将std :: string设置为0

来自分类Dev

std :: unordered_map <std :: String,myClass *>-std :: unordered_map :: erase()是否调用myClass的DTor?

来自分类Dev

std :: string {aka std :: basic_string <char>}'分配为'char *'

来自分类Dev

std :: string s1 {“ Modern C ++”,3}与std :: string s1 {str,3}

来自分类Dev

使用boost检查std :: string是否为有效的uuid

来自分类Dev

尽管字符串的结尾字符为空,但std :: string的长度是否一致?

来自分类Dev

`std::string` 是否在内部将其字符存储为有符号字符?

来自分类Dev

std :: string :: assign与std :: string :: operator =

来自分类Dev

将Google模拟匹配器描述为std :: string

来自分类Dev

将std :: string的元素解析为整数(C ++)

Related 相关文章

  1. 1

    不同大小的std :: string :: npos

  2. 2

    不同大小的std :: string :: npos

  3. 3

    使用std :: string :: npos时出错

  4. 4

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

  5. 5

    为什么我们有std :: string :: npos但没有std :: vector :: npos?

  6. 6

    为什么“ if(unsigned int == string :: npos)”可以为真?

  7. 7

    如何将std :: string分解为std :: string

  8. 8

    如何将std :: string分解为std :: string

  9. 9

    打印新行时std :: string为空

  10. 10

    将std :: String覆盖为char *

  11. 11

    是否可以从std :: basic_string继承?

  12. 12

    重载char *和std :: string是否安全?

  13. 13

    是否使用空的std :: optional <string> UB?

  14. 14

    是否在某处定义了空的std :: string?

  15. 15

    按值返回std :: string是否安全?

  16. 16

    如何知道 std::string 的编码是否正确?

  17. 17

    std :: unordered_map <std :: string,std :: function <void(std :: string&)是否只能容纳静态函数?

  18. 18

    std :: unordered_map <std :: string,std :: function <void(std :: string&)是否只能容纳静态函数?

  19. 19

    如果std :: is_trivial_v <T>为true,则std :: is_standard_layout_v <T>始终为真吗?

  20. 20

    在定义期间将std :: string设置为0与将std :: string设置为0

  21. 21

    std :: unordered_map <std :: String,myClass *>-std :: unordered_map :: erase()是否调用myClass的DTor?

  22. 22

    std :: string {aka std :: basic_string <char>}'分配为'char *'

  23. 23

    std :: string s1 {“ Modern C ++”,3}与std :: string s1 {str,3}

  24. 24

    使用boost检查std :: string是否为有效的uuid

  25. 25

    尽管字符串的结尾字符为空,但std :: string的长度是否一致?

  26. 26

    `std::string` 是否在内部将其字符存储为有符号字符?

  27. 27

    std :: string :: assign与std :: string :: operator =

  28. 28

    将Google模拟匹配器描述为std :: string

  29. 29

    将std :: string的元素解析为整数(C ++)

热门标签

归档