std:: from_chars
|
Определено в заголовочном файле
<charconv>
|
||
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(1) |
(начиная с C++17)
(constexpr начиная с C++23) |
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(2) | (начиная с C++17) |
Анализирует последовательность символов
[
first
,
last
)
для поиска шаблона, описанного ниже. Если ни один символ не соответствует шаблону или если значение, полученное при разборе соответствующих символов, не может быть представлено в типе
value
,
value
остается неизменным; в противном случае символы, соответствующие шаблону, интерпретируются как текстовое представление арифметического значения, которое сохраняется в
value
.
- "0x" или "0X" префиксы не распознаются, если base равна 16
- распознается только знак минуса (не знак плюса), и только для знаковых целочисленных типов параметра 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" ) - ведущие пробельные символы не игнорируются.
Содержание |
Параметры
| 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 << "String: " << 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: " << result << ", ptr -> " << std::quoted(ptr) << '\n'; else if (ec == std::errc::invalid_argument) std::cout << "This is not a number.\n"; else if (ec == std::errc::result_out_of_range) std::cout << "This number is larger than an int.\n"; } // C++23's constexpr from_char demo / C++26's operator bool() demo: 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 }
Вывод:
String: "1234". Result: 1234, ptr -> "" String: "15 foo". Result: 15, ptr -> " foo" String: "bar". This is not a number. String: " 42". This is not a number. String: "5000000000". This number is larger than an int.
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| 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<CharT,Traits>
)
|