【问题标题】:Lack of Implicit Conversions for Strings and STL Containers缺少字符串和 STL 容器的隐式转换
【发布时间】:2013-03-06 14:17:44
【问题描述】:

在编写类似代码时,为什么 C++ 没有为 std::string 和 STL 容器定义到 bool 的隐式转换

if (!x.empty()) { ... }

而不是更短

if (x) { ... }

x 的类型为std::string 或例如std::vector

我也对 std::string(在 C++03 中)没有在 STL 示例中隐式转换为 const char* 的事实感到困惑,例如

std::string s("filename");
std::ofstream(s.c_str();

【问题讨论】:

  • 如果你认为这会损害 C++ 的可用性,请远离我的代码。
  • 这似乎更像是一个咆哮而不是一个问题。 (另外,我非常不同意你的假设,即那些隐式转换会使编码更容易/更好。)
  • 欢迎添加。此外,使用x.empty() 而不是x.size()empty() 始终是常数时间,而size() 在某些容器中是线性的。
  • 在 C++11 中,您可以将std::string 直接作为文件流的文件名传递。那里不需要转换。
  • @Nordlöw:我怀疑反对票更多地与问题的措辞方式有关,而不是问题本身。

标签: c++ stl containers implicit-conversion stdstring


【解决方案1】:

在 C++ 中不这样做的一个原因是,这种转换往往会导致 subtle bugs

Stroustrup 在 C++ 编程语言 [第 3 版] 中专门解决了您关于 c_str() 的问题:

可以通过operator const char*() 而不是c_str() 提供转换为C 风格的字符串。这将提供隐式转换的便利,但在这种转换出乎意料的情况下会以意外为代价。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    相关资源
    最近更新 更多