std::string::npos == -1 总是 true 吗?

2023-11-23

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

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


NO,这并不总是正确的。然而,它比乍一看要复杂一些:

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

标题<string>定义了basic_string用于操作不同长度序列的类模板 类似 char 的对象和四个 typedef,string, u16string, u32string, and wstring,即专业名称basic_string<char>, basic_string<char16_t>, basic_string<char32_t>, and 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甚至会编译。

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

typedef size_t size_type;

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

结果是true if size_t至少与int(对于标准狂热者:具有更大或等于 4.13 中定义的整数转换等级)。否则,左手边将晋升为int,引起像这样的比较0xFFFF == -1 (for size_t being uint16_t and int具有 32 位),即false.

请注意,虽然 16 位系统本身已经不再常见(除了一些外形非常小的残余物),int标准不限制为 32 位。一个针对 x86_64 的编译器64 bit size_t和 128 位int在技​​术上是合规的。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::string::npos == -1 总是 true 吗? 的相关文章

随机推荐

  • 打破 R 中的嵌套循环

    非常简单的示例代码 仅用于演示 没有任何用处 repeat while 1 gt 0 for i in seq 1 100 break usually tied to a condition break break print finish
  • .NET Core Entity Framework - 在类库中添加 Context 迁移

    我在将初始迁移添加到 NET Core 类库内的实体框架数据库上下文时遇到问题 当我跑步时 dotnet ef migrations add migrationName c PlaceholderContext 我收到错误 Could no
  • 调试器可视化工具和“类型未标记为可序列化”

    我正在尝试创建一个调试器可视化工具 它可以显示任何内容的控制层次结构Control 已完成 但我遇到了例外 类型未标记为可序列化 我该如何克服这个问题 控件是 NET Windows Forms框架类型 我无法将其标记为可序列化 您还需要实
  • 为什么 const 允许参数中引用的隐式转换?

    这听起来像是一个愚蠢的问题 但我对以下行为感到困惑 void funcTakingRef unsigned int arg std cout lt lt arg void funcTakingByValue unsigned int arg
  • 带或不带引号的 JSON 对象

    我正在尝试学习 JSON 我了解到任何带有双引号的键的 javascript 对象都被视为 JSON 对象 我构建了这个对象 var jstr1 mykey my value 但是当我尝试使用 JSON parse jstr1 进行解析时
  • PROJ.4 库和 OSGB36

    一切顺利 我正在尝试使用 proj 4 库将纬度 经度坐标转换为 OSGB36 x 和 y 还有其他人成功地做到了这一点吗 我需要填充 srcPrj4String 和 destPrj4String 变量 例如 字符串 srcPrj4Stri
  • jQuery 可移动模态对话框

    我一直在寻找可拖动模式框的所有可用 jQuery 插件 唯一的问题是我发现的每个可拖动的模式框都需要标题栏 有谁知道有什么 jQuery 插件可以让我创建一个没有标题栏的可拖动模式框吗 在这种情况下 您可以通过框的边框拖动它 有什么方法可以
  • 无法访问 attr_accessor 定义的变量

    我正在使用 Thinking Sphinx 来运行搜索 并且我得到了适当的 ActiveRecord 模型 问题是 我想在每个模型上创建适当的链接路径和文本 然后通过 AJAX 将信息以 JSON 形式发送到浏览器 我使用以下内容来构建这些
  • 如何限制cakephp中的分页

    如何限制 cakephp 中的分页 假设我有 400 条记录 我只需要获取从第50条记录到第75条记录的25条记录 每页需要显示5条记录 我如何在分页中做到这一点 示例代码 this gt paginate array contain gt
  • Google App Engine Node.js 应用程序不健康

    我正在尝试在谷歌应用程序引擎上测试一个相当简单的node js应用程序 如下所示 它要做的就是监听 Firebase 数据库中的更改 然后向用户发送 GCM 消息 var Firebase require firebase var gcm
  • Apache HTTP BasicScheme.authenticate 已弃用?

    在 Apache HTTP Component 4 类 org apache http impl auth BasicScheme 中 我注意到该方法 public static Header authenticate final Cred
  • 动画边距/厚度

    我只是以为我已经知道 WPF 和 XAML 语法是如何工作的 呜呜 我收到消息 WithEvents variables can only be typed as classes interfaces or type parameters
  • 我可以在类外部初始化“constexpr static”成员吗?

    我正在使用可变宽度通信格式 处理它的结构看起来像这样 struct Header int msgType 1 len Header len sizeof this struct A public Header int x char y A
  • 每次更改 Rails 代码时都必须重新启动 Apache

    我正在使用 Apache 和 Passenger 运行 Rails 3 自从我从 Mongrel 切换到 Passenger 后 我发现每次更改代码时都必须重新启动 Apache 这是预期的行为吗 在开发中使用 Mongrel 是避免这个问
  • SwiftUI 将 TupleView 转换为 AnyView 数组

    Code 我有以下代码 struct CustomTabView View where Content View let children AnyView init ViewBuilder content escaping gt Conte
  • PyPlot 将替代 y 轴移动到背景

    在 pyplot 中 您可以使用以下命令更改不同图形的顺序zorder选项或通过更改顺序plot 命令 但是 当您通过添加替代轴时ax2 twinx 新轴将始终覆盖旧轴 如文档 是否可以更改轴的顺序以将替代 孪生 y 轴移动到背景 在下面的
  • “视觉继承”的现状如何

    我们有一个应用程序 它必须灵活地向用户显示其主表单 根据用户的不同 表单应该略有不同 也许这里或那里有一个额外的按钮 或者其他一些细微差别 为了停止编写代码来显式删除或添加控件等 我转向视觉继承来解决问题 在我认为是一种整洁 干净和逻辑的
  • 有没有办法在Python中创建类属性?

    由于某种原因 以下内容不起作用 gt gt gt class foo object property classmethod def bar cls return asdf gt gt gt foo bar
  • SimpleDateFormat toPattern 在 java 9 中的行为有所不同

    DateFormat dateFormat DateFormat getDateInstance DateFormat SHORT new Locale SV SE SimpleDateFormat dateFormat toPattern
  • std::string::npos == -1 总是 true 吗?

    标题相对来说是不言自明的 我认识到与其他答案的相似之处 但所有这些答案都有不同的运算符安排 因此也有不同的转换规则 所以我需要一个能够澄清这个特殊情况的答案 如果有人可以指出标准中解释这一点的部分 我会很乐意投票并接受答案 NO 这并不总是