为什么 std::string 没有隐式转换为 bool

2024-01-08

在 C++ 中是否有原因std::string不是隐式转换为bool?例如

std::string s = ""
if (s) { /* s in not empty */ }

与其他语言一样(例如 python)。我认为使用它很乏味empty method.


这大概could现在需要添加的是,C++11 添加了显式转换和上下文转换的概念。

When std::string是设计好的,但这些都不存在。这使得类支持转换为bool相当难以保证安全。特别是,这种转换可能(并且将会)在很多情况下发生,而您几乎不希望它发生。例如,如果我们假设std::string转换为false如果为空,否则true,那么你可以使用string本质上anywhere目的是整数或指针。

编译器不会告诉您类型不匹配,而是将字符串转换为 bool,然后将 bool 转换为整数(false -> 0,true -> 1)。

在字符串类型的许多早期尝试中,类似的事情经常发生(并且有many)委员会显然决定最好将隐式转换保持在绝对最小值(因此关于由string是从 C 样式字符串创建字符串对象)。

为了更安全地处理 bool 转换,设计了多种方法。一个正在转换为void *相反,这可以防止一些问题,但不能防止其他问题(这是 iostreams 使用的)。还有一个“safe bool”习语(实际上,更像是一个“safe bool”主题,其中有几种变体)。虽然这些确实改进了对允许和不允许的转换的控制,但大多数都涉及相当多的开销(典型的安全 bool 需要大约 50 行代码的基类,加上从该基类的派生等。 )

至于显式转换和上下文转换有何帮助,基本思想非常简单。您可以(从 C++11 开始)将转换函数标记为explicit,这使得它只能在使用显式转换为目标类型的情况下使用:

struct X {
    explicit operator bool() { return true; }
};

int main() { 
    X x;
    bool b1 = static_cast<bool>(x); // compiles
    bool b2 = x;   // won't compile
}

上下文转换增加了一点,让转换为 bool 隐式发生,但是only在类似的事情中if语句,因此使用具有上面转换函数的类,您将得到:

X x;
if (x) // allowed

int y = x; // would require explicit cast to compile

我想补充一点,关于“正交性”的抱怨在这里似乎完全不适用。虽然方便的,将字符串转换为布尔值并没有多大意义。如果有的话,我们应该抱怨这有多么奇怪string("0")转换为1(发生这种情况的语言)。

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

为什么 std::string 没有隐式转换为 bool 的相关文章

  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS

随机推荐

  • 多维 NumPy PolyFit 和 PolyVal?

    假设一个 n 维观测值数组被重塑为一个 2d 数组 其中每一行都是一个观测值集 使用这种重塑方法 np polyfit可以计算整个 ndarray 矢量化 的二阶拟合系数 fit np polynomial polynomialpolyfi
  • Accepts_nested_attributes_for 导致 SQLException

    我想用accepts nested attributes for创建一个 Article 对象has many部分 class Article lt ActiveRecord Base has many sections order gt
  • C#、硒网络驱动程序

    我想创建一个可以在所有测试中调用的变量网络驱动程序 我目前有以下示例用于显示目的 在这里我定义了我想要使用的网络驱动程序 using OpenQA Selenium using System using System Collections
  • Apache - Init:无法打开服务器私钥文件

    我正在本地主机上运行的 apache 上启用 ssl 我生成了一个自签名证书并将其放在通常的位置 david david web ll etc ssl certs rwxrwxrwx 1 david david 977 Mar 7 13 1
  • 如何打印多份带有条形码的报告\或在一份报告中打印多个条形码

    我有一个barcode使用序列的报告 Oracle后端 来生成我的barcode数字 这是我的查询中的 SELECT to char PALLET ID NO SEQ nextval FROM dual 我将此字段放置在设计器窗口中 它将显
  • 如何垂直对齐弹性盒内的文本?

    我想使用 flexbox 来垂直对齐某个内容 li 但没有取得巨大成功 我在网上查了一下 很多教程实际上使用了一个包装 div 来获取align items center从父级的 Flex 设置中 但我想知道是否可以删除这个附加元素 我选择
  • 从不同路径检索 cookie

    我当前的文档 URL 是 http 127 0 0 1 foo 我需要更改 http 127 0 0 1 bar 的 cookie 值 document cookie 为空 因为文档的 URL 是 foo 目前 我只想读取 cookie 值
  • Wicked_pdf 在开发中工作正常,但在生产中却不行

    我一直在使用 wicked pdf 在 Rails 中生成一些 PDF 它在我的开发环境中运行良好 但是当我尝试在生产环境中生成 PDF 时 我收到 500 错误 但我的日志中没有具体错误 我注意到的第一件事是 wkhtmltopdf 二进
  • 将元数据添加到客户条带中

    因此我需要为客户添加一个唯一的标识符 通过条带元数据 这就是我现在完全完成的构建方式 但是我只有最后一部分来告诉我用户购买了哪个包 我试着看这里 计划条纹 https stripe com docs api php plans 代码在这里
  • 自动选择节点集群中的领导者

    在知道节点随时启动和关闭的情况下 可用于在节点集群中选择领先节点的最佳方法 算法是什么 如果可以用 Java 实现 那就更好了 我之前用Java实现过Paxos算法 它非常有用 而且相当简单 花了大约 16 个小时来制作一个演示 使用线程来
  • 如何为node.js服务器分配域名? [复制]

    这个问题在这里已经有答案了 我有一个node js服务器监听4000端口 访问该服务的URL是这样的 http 42 12 251 830 4000 我买了域名 www mydomain com 如何将其分配给我的服务器 首先我使用转发 但
  • 如何更改导航栏图标的颜色? (安卓工作室)

    To avoid confusion as to what the navigationbaractually is here s a 正如您所看到的 我使用以下方法添加了一种新颜色而不是标准黑色
  • 迭代 Torchtext.data.BucketIterator 对象会抛出 AttributeError 'Field' 对象没有属性 'vocab'

    当我尝试查看批次时 通过打印下一个迭代BucketIterator对象 即AttributeError被抛出 tv datafields Tweet TEXT Anger LABEL Fear LABEL Joy LABEL Sadness
  • 如何保存文本编辑中的文本

    帮助我 我想完成此代码并使用 Qt Widgets 从 PyQt5 中的文本编辑器保存文本文件 Q 文件对话框 get 保存文件名 帮我 我想在文本编辑器中写入文本并保存它 但我不知道如何完成 Save File 功能 Code from
  • 有 2 个未决意图的警报管理器只有 1 个有效?

    我设置了 2 个闹钟 一个用于通知 另一个用于执行一些任务 我的问题是 似乎只有一个警报起作用 通知服务 第一个警报设置 另一个警报永远不会响起 这是我的代码 Intent myIntent1 new Intent getApplicati
  • QWidget 用于显示带有小图片的文本(图标/表情符号)

    这样的小部件存在吗 我可以根据以下内容编写自己的小部件QLabels 和布局类似于http qt project org doc qt 5 qtwidgets layouts flowlayout example html http qt
  • 业力 - 找不到插件

    我正在尝试使用 karma 运行 js 测试用例 但总是出现插件未找到错误 有趣的是同一个配置文件 对我的其他同事来说工作得很好 这是日志 karma start karma conf js 04 10 2016 17 51 24 755
  • IsUnique=Yes 时唯一键和索引有什么区别?

    我有一个带有主键的表 但我希望约束另外两列 以便保证两者的组合始终是唯一的 一个愚蠢的例子 在 BOOKS 表中 IBAN 列是主键 但 Title 和 Author 列的组合也应该始终是唯一的 在 SQL Server Managemen
  • 从 ClientModelValidationContext 访问完整的 html 字段属性

    我有一个自定义验证属性 我正在将其从 asp net 转移到 asn net core 这是一个简单的 requiredif 属性 实现了 IClientModelValidator public class RequiredIfAttri
  • 为什么 std::string 没有隐式转换为 bool

    在 C 中是否有原因std string不是隐式转换为bool 例如 std string s if s s in not empty 与其他语言一样 例如 python 我认为使用它很乏味empty method 这大概could现在需要