为什么 std::(i|o)fstream 类的构造函数和 open 方法接受一个以 const char* 形式表示文件名的参数,而不是使用 std::string 呢?似乎 STL 的创建者会想要使用他们所编写的内容来替换使用其所写类的类型。
这个库中的string
部分是在流之后开发的,没人想到要做明显的修改。
仅仅是由于政治和时间上的现实,他们在发布C++98之前没有能够处理这个问题,而且因为你总是可以用.c_str()
来解决它,所以也没有人再次提起。
C++0x修复了这个问题(参见27.9.1.6)。
欢迎使用C++。
<string>
的情况下使用。我当时不同意,现在仍然不同意,但我必须承认这个论点有一些优点。 - sbi据我所知,这主要是出于历史原因。在std::string
存在之前,ifstream
和ofstream
就已经存在了。当时它们甚至还没有std::
。
const char*
更改为std::string
不会破坏现有的代码,因为通过string
的const char*
构造函数,它们之间存在隐式转换(除非我误解了什么,这总是可能的)。为什么他们没有改变它呢? - Seth Carnegiestd::string
жһ„йҖ еҮҪж•°дјҡз ҙеқҸе·Із»Ҹзј–иҜ‘зҡ„д»Јз Ғзҡ„дәҢиҝӣеҲ¶е…је®№жҖ§гҖӮеҸҰдёҖж–№йқўпјҢж·»еҠ дёҖдёӘйҮҚиҪҪжҳҜе®Ңе…ЁеҸҜд»Ҙзҡ„пјҢ并且已з»ҸеңЁC++0xж ҮеҮҶдёӯе®һзҺ°дәҶгҖӮ - Ken Bloom类std::string
实现了“运行时大小可调整的字符串”概念。当您需要一个仅在运行时才知道大小且可以在运行时调整大小的字符串时,应使用此类。在不需要这些功能的情况下,使用std::string
会过度。显然,库的作者认为他们不需要一个运行时可调整大小的字符串来表示文件名,因此他们选择了一种简约的解决方案:在C字符串足够的情况下使用C字符串。这实际上是设计库接口的一个非常好的原则:永远不要要求您实际上不需要的东西。
确实,现在我们经常看到人们鼓励C++程序员在需要任何字符串时都使用std::string
。他们经常声称经典的C字符串应该保留给C代码。在一般情况下,这是一种虚假的哲学。在像Java这样的语言中,比较重的对象(如std::string
)的不必要使用更为合适,但在C ++中通常是不可接受的。
是的,在某些C++应用程序中始终使用std::string
是可能的(“可以在C++中编写Java程序”),但在像C ++标准库这样的通用低级库中,强制用户在没有充分理由的情况下使用std::string
(即强加不必要的要求)看起来不好。
std::string
应用于STL继承的流特性,他们从未费心更新它。我不确定C++0x是否修复了这个问题;我不认为它有这样做。 - Lightness Races in Orbitstd::string
的c_str()
并将其传递给该函数的C字符串版本,这是有意义的。 - AnT stands with Russiastd::string
非常适合。你说“库的作者认为他们不需要一个运行时可调整大小的字符串来表示文件名”,你有参考资料还是这只是猜测? - idzstd::string
,也不是const char*
,而是采用一对迭代器。 - R. Martinho Fernandes
history
标签,因为我相信它背后一定有历史原因。 - Xeostd::string const&
,因此本讨论纯粹是历史性的。 - ildjarnstd
库。 :) - Xeo