在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
类中没有这个方法?
谢谢!
你的问题基本上是关于string
类设计背后的哲学。我只能说。
为什么string
对const char*
有强制转换操作符?强制转换操作符是其他操作的语法糖,只有在特殊情况下才真正需要。实际上,它们是永远不需要的——你总是可以用另一种方式来完成同样的目标。
string
已经通过c_str
和data
提供了与旧的c风格接口交互的方法。向组合中添加强制转换操作符不会增加功能,反而会增加类的复杂性。此外,使用强制转换操作符在语义上总是很模糊。在调用站点代码中,像static_cast <const char*>
这样的强制转换通常被认为是一个编译时操作。通过运行时代码执行这种强制转换,会使代码产生歧义。这不是很清楚。由于期望和实际情况并不相同,因此误用这种运行时强制转换比误用编译时等效强制转换要容易得多。
我认为不应该在不需要的地方使用隐式转换操作符;
进行这些更改的主要原因是线程安全,特别是避免使迭代器和引用失效。为此,需要空终止缓冲区。
更多内容请参阅提案N2534