Взяв строку C, класс C ++ 03 std::fstream
уменьшил зависимость от класса std::string
. Однако в C ++ 11 класс std::fstream
разрешает передавать std::string
для своего параметра конструктора.
Теперь вы можете задаться вопросом, почему не существует прозрачного преобразования из std:string
в строку C, поэтому класс, который ожидает строку C, все равно может принять std::string
точно так же, как класс, который ожидает std::string
может взять строку C.
Причина в том, что это приведет к циклу преобразования, что, в свою очередь, может привести к проблемам. Например, предположим, что std::string
можно преобразовать в строку C, чтобы вы могли использовать std::string
s с fstream
s. Предположим также, что строка C конвертируется в std::string
s, как и состояние в текущем стандарте. Теперь рассмотрим следующее:
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()
.