为什么在C ++ 11中std :: string hasn' const char * cast运算符?

时间:2014-07-30 22:28:43

标签: c++ c++11 stl stdstring

在C ++ 03中,对于std::string类,c_str()data()方法具有不同的行为。

第一个返回一个以null结尾的字符数组,最后一个的管理完全依赖于实现。实际上,c_str() 可以返回指向另一个预分配缓冲区的指针,该缓冲区始终包含以空字符结尾的字符串,但这不是必需的。但是,复杂性必须是恒定的。

第二个只是返回指向std::string的内部缓冲区的指针,该缓冲区可以是空终止的。

因此,在C ++ 03中,您可以猜测const char*的强制转换运算符不是一个好主意。实际上,大多数情况下,预期的行为是使用以空值终止的C样式字符串,但是,由于c_str()的实现可能会有所不同,因此在强制转换运算符后面可能存在隐藏的开销。在另一种情况下,如果强制转换操作符返回与data()相同的结果,则可能会引起混淆。

但是,对于C ++ 11,c_str()data()具有相同的行为。 c_str()返回指向std::string对象内部缓冲区的指针。 const char*的强制转换运算符不再含糊不清。为什么在C ++ 11的std::string类中不存在此方法?

谢谢!

2 个答案:

答案 0 :(得分:3)

你的问题基本上是关于string类设计背后的哲学。我只能说。

为什么string有一个强制转换操作符const char*?演员操作员是其他操作的语法糖,只有在特殊情况下才真正需要。真的,它们永远不需要 - 你总能以另一种方式实现同​​样的目标。

string已经提供了通过c_strdata来与旧的C风格界面进行交互的方法。在组合中添加强制转换操作符并不会增加功能,并且会增加类的复杂性。而且,使用强制转换操作符总是语义模糊。在调用站点代码中,通常期望诸如static_cast <const char*>之类的强制转换是编译时操作。通过运行时代码执行此转换,您可以模糊代码。它不那么清楚。由于期望和现实并不相同,因此滥用此运行时转换比编译时等效更容易。

我认为在任何不真正需要的地方都不应该存在隐式转换运算符;而且它不在这里。

答案 1 :(得分:1)

这些更改的主要原因是线程安全,特别是避免使迭代器和引用无效。为此,需要使用null终止缓冲区。

可以在提案N2534上阅读更多内容。