Defined in header <charconv> | ||
---|---|---|
(1) | ||
std::from_chars_result from_chars( const char* first, const char* last, /* integer-type */& value, int base = 10 ); | (since C++17) (until C++23) | |
constexpr std::from_chars_result from_chars( const char* first, const char* last, /* integer-type */& value, int base = 10 ); | (since 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 ); | (until C++23) | |
std::from_chars_result from_chars( const char* first, const char* last, /* floating-point-type */& value, std::chars_format fmt = std::chars_format::general ); | (since C++23) | |
Helper types | ||
struct from_chars_result { const char* ptr; std::errc ec; }; | (3) | (since C++17) |
Analyzes the character sequence [
first
,
last
)
for a pattern described below. If no characters match the pattern or if the value obtained by parsing the matched characters is not representable in the type of value
, value
is unmodified, otherwise the characters matching the pattern are interpreted as a text representation of an arithmetic value, which is stored in value
.
char2) Floating-point parsers: Expects the pattern identical to the one used by
std::strtod
in the default ("C") locale, except that fmt
has std::chars_format::scientific
set but not std::chars_format::fixed
, the exponent part is required (otherwise it is optional) fmt
has std::chars_format::fixed
set but not std::chars_format::scientific
, the optional exponent is not permitted fmt
is std::chars_format::hex
, the prefix "0x"
or "0X"
is not permitted (the string "0x123"
parses as the value "0"
with unparsed remainder "x123"
) std::round_to_nearest
. The library provides overloads for all cv-unqualified floating-point types as the referenced type of the parameter value . | (since C++23) |
std::from_chars_result
has no base classes, or members other than ptr
, ec
and implicitly declared special member functions.first, last | - | valid character range to parse |
value | - | the out-parameter where the parsed value is stored if successful |
base | - | integer base to use: a value between 2 and 36 (inclusive). |
fmt | - | floating-point formatting to use, a bitmask of type std::chars_format |
On success, returns a value of type std::from_chars_result
such that ptr
points at the first character not matching the pattern, or has the value equal to last
if all characters match and ec
is value-initialized.
If there is no pattern match, returns a value of type std::from_chars_result
such that ptr
equals first
and ec
equals std::errc::invalid_argument
. value
is unmodified.
If the pattern was matched, but the parsed value is not in the range representable by the type of value
, returns value of type std::from_chars_result
such that ec
equals std::errc::result_out_of_range
and ptr
points at the first character not matching the pattern. value
is unmodified.
friend bool operator==( const from_chars_result&, const from_chars_result& ) = default; | (since C++20) |
Checks if ptr
and ec
of both arguments are equal respectively.
This function is not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when std::from_chars_result
is an associated class of the arguments.
The !=
operator is synthesized from operator==
.
Throws nothing.
Unlike other parsing functions in C++ and C libraries, std::from_chars
is locale-independent, non-allocating, and non-throwing. Only a small subset of parsing policies used by other libraries (such as std::sscanf
) is provided. This is intended to allow the fastest possible implementation that is useful in common high-throughput contexts such as text-based interchange (JSON or XML).
The guarantee that std::from_chars
can recover every floating-point value formatted by std::to_chars
exactly is only provided if both functions are from the same implementation.
A pattern consisting of a sign with no digits following it is treated as pattern that did not match anything.
Feature-test macro | Value | Std | |
---|---|---|---|
__cpp_lib_to_chars | 201611L | (C++17) | Elementary string conversions (std::to_chars , std::from_chars ) |
__cpp_lib_constexpr_charconv | 202207L | (C++23) | Add constexpr modifiers to functions std::to_chars and std::from_chars for integral types |
#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 << "That isn't 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: auto to_int = [](std::string_view s) -> std::optional<int> { if (int value; std::from_chars(s.data(), s.data() + s.size(), value).ec == std::errc{}) 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 }
Possible output:
String: "1234". Result: 1234, ptr -> "" String: "15 foo". Result: 15, ptr -> " foo" String: "bar". That isn't a number. String: " 42". That isn't a number. String: "5000000000". This number is larger than an int.
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 2955 | C++17 | this function was in <utility> and used std::error_code | moved to <charconv> and uses std::errc |
LWG 3373 | C++17 | std::from_chars_result might have additional members | additional members are prohibited |
(C++17) | converts an integer or floating-point value to a character sequence (function) |
(C++11)(C++11)(C++11) | converts a string to a signed integer (function) |
(C++11)(C++11)(C++11) | converts a string to a floating point value (function) |
(C++11) | converts a byte string to an integer value (function) |
converts a byte string to a floating point value (function) |
|
reads formatted input from stdin , a file stream or a buffer (function) |
|
extracts formatted data (public member function of std::basic_istream<CharT,Traits> ) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/from_chars