为什么 std::fstream 类不采用 std::string?
这不是一个设计问题,真的,虽然看起来像.(好吧,这是一个设计问题).我想知道的是为什么 C++ std::fstream
类在它们的构造函数或 open 方法中不采用 std::string
.每个人都喜欢代码示例,所以:
This isn't a design question, really, though it may seem like it. (Well, okay, it's kind of a design question). What I'm wondering is why the C++ std::fstream
classes don't take a std::string
in their constructor or open methods. Everyone loves code examples so:
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::string filename = "testfile";
std::ifstream fin;
fin.open(filename.c_str()); // Works just fine.
fin.close();
//fin.open(filename); // Error: no such method.
//fin.close();
}
这让我在处理文件时一直都在使用.C++ 库肯定会尽可能使用 std::string
吗?
This gets me all the time when working with files. Surely the C++ library would use std::string
wherever possible?
推荐答案
通过采用 C 字符串,C++03 std::fstream
类减少了对 std::string
类的依赖.然而,在 C++11 中,std::fstream
类允许为它的构造函数参数传递一个 std::string
.
By taking a C string the C++03 std::fstream
class reduced dependency on the std::string
class. In C++11, however, the std::fstream
class does allow passing a std::string
for its constructor parameter.
现在,您可能想知道为什么没有从 std:string
到 C 字符串的透明转换,因此需要 C 字符串的类仍然可以采用 std::string
就像一个需要 std::string
的类可以接受一个 C 字符串.
Now, you may wonder why isn't there a transparent conversion from a std:string
to a C string, so a class that expects a C string could still take a std::string
just like a class that expects a std::string
can take a C string.
原因是这会导致转换周期,进而可能导致问题.例如,假设 std::string
可转换为 C 字符串,以便您可以将 std::string
s 与 fstream
s 一起使用.还假设 C 字符串可转换为 std::string
s,就像当前标准中的状态一样.现在,请考虑以下事项:
The reason is that this would cause a conversion cycle, which in turn may lead to problems. For example, suppose std::string
would be convertible to a C string so that you could use std::string
s with fstream
s. Suppose also that C string are convertible to std::string
s as is the state in the current standard. Now, consider the following:
void f(std::string str1, std::string str2);
void f(char* cstr1, char* cstr2);
void g()
{
char* cstr = "abc";
std::string str = "def";
f(cstr, str); // ERROR: ambiguous
}
因为您可以在 std::string
和 C 字符串之间转换任何一种方式,所以对 f()
的调用可以解析为两个 f()
替代方案,因此是模棱两可的.解决方案是通过明确一个转换方向来打破转换循环,这就是 STL 选择用 c_str()
做的事情.
Because you can convert either way between a std::string
and a C string the call to f()
could resolve to either of the two f()
alternatives, and is thus ambiguous. The solution is to break the conversion cycle by making one conversion direction explicit, which is what the STL chose to do with c_str()
.
相关文章