为什么 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 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 多维 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现在需要