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/