Можно ли использовать std::ifstream и std::ofstream с аргументом имени файла std::string_view?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли использовать std::ifstream и std::ofstream с аргументом имени файла std::string_view?

Сообщение Anonymous »

Я был удивлен, обнаружив, что следующий код не компилируется:

Код: Выделить всё

auto example_function(std::string_view filename) {

std::fstream ofile(filename, std::ios_base::out | std::ios_base::binary);

std::fstream ifile(filename, std::ios_base::in | std::ios_base::binary);
}
Обе эти строки вызывают одинаковые ошибки:

Код: Выделить всё

error: no matching function for call to ‘std::basic_fstream::basic_fstream(std::string_view&, std::_Ios_Openmode)’
error: ‘class std::basic_string_view’ has no member named ‘make_preferred’
= decltype(std::declval().make_preferred().filename())>

error: no matching function for call to ‘std::basic_fstream::basic_fstream(std::string_view&, std::_Ios_Openmode)’
error: ‘class std::basic_string_view’ has no member named ‘make_preferred’
= decltype(std::declval().make_preferred().filename())>
Параметры конструктора включают аргументы типа const char* и std::string&.
Я был удивлен, обнаружив, что ни один параметр не включает std::string_view. Есть ли какая-либо очевидная причина, по которой это не было включено?
Есть ли реальный способ компилировать этот код? Преобразование из std::string_view в const char* может быть не особенно безопасным, поскольку std::string_view не может быть завершено нулем в конце его .size().
Создание std::string, с другой стороны, приведет к дополнительному копированию и выделению.

Подробнее здесь: https://stackoverflow.com/questions/794 ... lename-arg
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»