在C++03中,对于std::string
类,c_str()
和data()
方法有不同的行为。
第一个返回一个以空结尾的字符数组,最后一个数组的管理完全依赖于实现。实际上,c_str()
可以返回指向另一个预分配缓冲区的指针,该缓冲区总是包含一个以空结尾的字符串,但这不是强制性的。然而,复杂性必须是恒定的。
第二个简单返回指向std::string
内部缓冲区的指针,该指针可以为空终止,也可以为空终止。
因此,在C++03中,您可以猜到const char*
的cast运算符不是一个好主意。实际上,大多数情况下,预期的行为是有一个以空结尾的C样式字符串,但是,由于c_str()
的实现可能不同,cast操作符后面可能存在隐藏的开销。在另一种情况下,如果cast操作符返回与data()
相同的结果,则可能会造成混淆。
然而,对于C++11,c_str()
和data()
具有相同的行为。c_str()
返回指向std::string
对象内部缓冲区的指针。const char*
的cast运算符不再是模棱两可的了。为什么此方法不存在于std::string
类中的C++11中?
谢谢!
发布于 2014-07-30 14:37:03
您的问题从根本上讲是关于设计string
类的哲学。我只能认为。
为什么string
应该有一个const char*
的cast操作符?Cast运算符是其他操作的语法糖,只有在不寻常的情况下才真正需要。真的,他们从来不需要--你总是可以用另一种方式实现同样的目标。
string
已经提供了通过c_str
和data
与旧C风格接口交互的方法。在混合中添加一个强制转换操作符并不会增加功能,而且会增加类的复杂性。此外,使用cast运算符在语义上总是很模糊。在调用站点代码中,像使用static_cast <const char*>
这样的强制转换通常需要编译时操作。通过通过运行时代码执行此强制转换,可以将代码歧义化。不太清楚。因为期望和现实是不一样的,所以比编译时更容易误用这个运行时强制转换。
我认为,在不真正需要的地方不应该有隐式转换操作符;而且它不在这里。
发布于 2014-07-30 14:44:40
这些更改的主要原因是线程安全,特别是避免使迭代器和引用无效。要使这种情况发生,需要空终止缓冲区。
可以阅读更多关于N2534提案的内容。
https://stackoverflow.com/questions/25048019
复制