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

标签 c++ string casting boolean

C++ 中的 std::string 没有隐式转换为 bool 有什么原因吗?例如

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

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

最佳答案

这可能可以添加,因为 C++11 已经添加了显式转换和上下文转换的概念。

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

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

这样的事情经常发生,在字符串类型的许多早期尝试中(并且有很多)委员会显然认为最好将隐式转换保持在绝对最低限度(所以关于唯一的string 支持的隐式转换是从 C 风格的字符串创建字符串对象。

设计了许多方法来更安全地处理转换为 boolean 值。一个是转换为 void * ,这可以避免一些问题,但不能避免其他问题(iostreams 使用了这个)。还有一个“安全 boolean ”成语(实际上,更像是一个“安全 boolean ”主题,其中有几个变体)。虽然这些确实改进了对允许和不允许转换的控制,但它们中的大多数都涉及相当多的开销(典型的安全 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

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

关于c++ - 为什么 std::string 没有隐式转换为 bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28226967/

相关文章:

c++ - 内联模板函数

c++ - 是否可以使用 `requires` 子句启用/禁用纯虚函数?

java - 如何在 Java 中要求用户在循环中重新输入某个字符串时只打印一次文本

C++ - 连接字符串(如 PHP?)

python - 在 nim 中比较两个字符串的函数比 python 慢

ios - AnyObject 不可转换为 'String'

java - Android jni 和 opencv 运行时无法加载库

c++ - 为什么我的链接列表在函数调用后被删除?

java - 无法使用反射从 EJB 内的 Field 转换为 EntityManager

sql - Postgres 在连接时无法识别 CAST 的问题