std::from_chars
| Определено в заголовочном файле <charconv>
|
||
std::from_chars_result from_chars( const char* first, const char* last, /* целочисленный тип */& value, int base = 10 ); |
(1) | (начиная с C++17) (constexpr начиная с C++23) |
| (2) | ||
std::from_chars_result from_chars( const char* first, const char* last, float& value, std::chars_format fmt = std::chars_format::general ); std::from_chars_result from_chars( const char* first, const char* last, double& value, std::chars_format fmt = std::chars_format::general ); std::from_chars_result from_chars( const char* first, const char* last, long double& value, std::chars_format fmt = std::chars_format::general ); |
(начиная с C++17) (до C++23) |
|
std::from_chars_result from_chars( const char* first, const char* last, /* тип с плавающей запятой */& value, std::chars_format fmt = std::chars_format::general ); |
(начиная с C++23) | |
Анализирует последовательность символов [first, last) на предмет шаблона, описанного ниже. Если ни один символ не соответствует шаблону или если значение, полученное в результате анализа соответствующих шаблону символов, не может быть представлено в виде value, value не изменяется, иначе символы, соответствующие шаблону, интерпретируются как текстовое представление арифметического значения, которое сохраняется в value.
- префиксы
"0x"или"0X"не распознаются, еслиbaseравно 16 - распознаётся только знак минус (не знак плюс) и только для целочисленных типов со знаком параметра
value - ведущие пробелы не игнорируются.
char в качестве ссылочного типа параметра value.- знак плюс не распознаётся за пределами экспоненты (в начале разрешён только знак минус)
- если в
fmtустановлен std::chars_format::scientific, но не установлен std::chars_format::fixed, показатель степени является обязательным (иначе он необязателен) - если в
fmtустановлен std::chars_format::fixed, но не установлен std::chars_format::scientific, необязательная экспонента не разрешена - если в
fmtустановлен std::chars_format::hex, то префикс"0x"или"0X"не разрешён (строка"0x123"разбирается как значение"0"с неразобранным остатком"x123") - ведущие пробелы не игнорируются.
|
Библиотека предоставляет перегрузки для всех cv-неквалифицированных типов с плавающей запятой в качестве ссылочного типа параметра
value. |
(начиная с C++23) |
Параметры
| first, last | — | допустимый диапазон символов для разбора |
| value | — | выходной параметр, в котором в случае успеха сохраняется разобранное значение |
| base | — | используемая целочисленная база: значение от 2 до 36 (включительно). |
| fmt | — | при форматировании с плавающей запятой, битовая маска типа std::chars_format |
Возвращаемое значение
В случае успеха возвращает значение типа std::from_chars_result, такое, что ptr указывает на первый символ, не соответствующий шаблону, или имеет значение, равное last, если все символы соответствуют шаблону, и ec инициализируется значением.
Если совпадений с шаблоном нет, возвращает значение типа std::from_chars_result, такое, что ptr равно first, а ec равно std::errc::invalid_argument. value не изменяется.
Если шаблон найден, но разобранное значение не находится в диапазоне, представленном типом value, возвращается значение типа std::from_chars_result, такое что ec равно std::errc::result_out_of_range, а ptr указывает на первый символ, не соответствующий шаблону. value не изменяется.
Исключения
Ничего не генерирует.
Примечание
В отличие от других функций синтаксического анализа в библиотеках C++ и C, std::from_chars не зависит от локали, не распределяет память и не генерирует исключения. Предоставляется лишь небольшое подмножество политик синтаксического анализа, используемых другими библиотеками (например, std::sscanf). Она предназначена для обеспечения максимально быстрой реализации, которая полезна в обычных контекстах с высокой пропускной способностью, таких как текстовый обмен (JSON или XML).
Гарантия того, что std::from_chars может точно восстановить каждое значение с плавающей запятой, отформатированное std::to_chars, предоставляется только в том случае, если обе функции относятся к одной и той же реализации.
Шаблон, состоящий из знака без следующих за ним цифр, рассматривается как шаблон, который ничему не соответствует.
| Макрос тест функциональности | Значение | Стандарт | |
|---|---|---|---|
__cpp_lib_to_chars |
201611L |
(C++17) | Элементарные преобразования строк (std::from_chars, std::to_chars)
|
202306L |
(C++26) | Проверка успеха или неудачи функций <charconv> | |
__cpp_lib_constexpr_charconv |
202207L |
(C++23) | Добавляет модификаторы constexpr в перегрузки std::from_chars и std::to_chars для целочисленных типов
|
Пример
#include <cassert>
#include <charconv>
#include <iomanip>
#include <iostream>
#include <optional>
#include <string_view>
#include <system_error>
int main()
{
for (std::string_view const str : {"1234", "15 foo", "bar", " 42", "5000000000"})
{
std::cout << "Строка: " << std::quoted(str) << ". ";
int result{};
auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), result);
if (ec == std::errc())
std::cout << "Результат: " << result << ", ptr-> " << std::quoted(ptr) << '\n';
else if (ec == std::errc::invalid_argument)
std::cout << "Это не число.\n";
else if (ec == std::errc::result_out_of_range)
std::cout << "Это число больше, чем int.\n";
}
// Демонстрация constexpr from_char в C++23 / демонстрация operator bool() в C++26:
auto to_int = [](std::string_view s) -> std::optional<int>
{
int value{};
#if __cpp_lib_to_chars >= 202306L
if (std::from_chars(s.data(), s.data() + s.size(), value))
#else
if (std::from_chars(s.data(), s.data() + s.size(), value).ec == std::errc{})
#endif
return value;
else
return std::nullopt;
};
assert(to_int("42") == 42);
assert(to_int("foo") == std::nullopt);
#if __cpp_lib_constexpr_charconv and __cpp_lib_optional >= 202106
static_assert(to_int("42") == 42);
static_assert(to_int("foo") == std::nullopt);
#endif
}
Вывод:
Строка: "1234". Результат: 1234, ptr -> ""
Строка: "15 foo". Результат: 15, ptr -> " foo"
Строка: "bar". Это не число.
Строка: " 42". Это не число.
Строка: "5000000000". Это число больше, чем int.
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 2955 | C++17 | эта функция была в <utility> и использовала std::error_code | перемещена в <charconv> и использует std::errc |
| LWG 3373 | C++17 | std::from_chars_result может иметь дополнительные элементы
|
дополнительные элементы запрещены |
Смотрите также
(C++17) |
тип возвращаемого значения std::from_chars (класс) |
(C++17) |
преобразует целое число или значение с плавающей запятой в последовательность символов (функция) |
(C++11)(C++11)(C++11) |
преобразует строку в целое число со знаком (функция) |
(C++11)(C++11)(C++11) |
преобразует строку в значение с плавающей запятой (функция) |
(C++11) |
преобразует байтовую строку в целочисленное значение (функция) |
| преобразует байтовую строку в число с плавающей запятой (функция) | |
| производит форматированный ввод из stdin, файлового потока или буфера (функция) | |
извлекает форматированные данные из потока ввода std::basic_istream (public функция-элемент std::basic_istream)
|