std:: from_chars
|
Défini dans l'en-tête
<charconv>
|
||
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(1) |
(depuis C++17)
(constexpr depuis C++23) |
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(2) | (depuis C++17) |
Analyse la séquence de caractères
[
first
,
last
)
selon un motif décrit ci-dessous. Si aucun caractère ne correspond au motif ou si la valeur obtenue en analysant les caractères correspondants n'est pas représentable dans le type de
value
,
value
reste inchangé, sinon les caractères correspondant au motif sont interprétés comme une représentation textuelle d'une valeur arithmétique, qui est stockée dans
value
.
- "0x" ou "0X" ne sont pas reconnus si base vaut 16
- seul le signe moins est reconnu (pas le signe plus), et uniquement pour les types entiers signés de value
- les espaces blancs en tête ne sont pas ignorés.
- le signe plus n'est pas reconnu en dehors de l'exposant (seul le signe moins est autorisé au début)
-
si
fmta std::chars_format::scientific défini mais pas std::chars_format::fixed , la partie exposant est obligatoire (sinon elle est optionnelle) -
si
fmta std::chars_format::fixed défini mais pas std::chars_format::scientific , l'exposant optionnel n'est pas autorisé -
si
fmtest std::chars_format::hex , le préfixe "0x" ou "0X" n'est pas autorisé (la chaîne "0x123" est analysée comme la valeur "0" avec un reste non analysé "x123" ) - les espaces blancs en début de chaîne ne sont pas ignorés.
Table des matières |
Paramètres
| first, last | - | plage de caractères valide à analyser |
| value | - | paramètre de sortie où la valeur analysée est stockée en cas de succès |
| base | - | base entière à utiliser : une valeur comprise entre 2 et 36 (inclus). |
| fmt | - | formatage en virgule flottante à utiliser, un masque de bits de type std::chars_format |
Valeur de retour
En cas de succès, retourne une valeur de type
std::from_chars_result
telle que
ptr
pointe vers le premier caractère ne correspondant pas au motif, ou ait la valeur égale à
last
si tous les caractères correspondent et
ec
est initialisé à sa valeur par défaut.
S'il n'y a pas de correspondance de motif, retourne une valeur de type
std::from_chars_result
telle que
ptr
soit égal à
first
et
ec
soit égal à
std::errc::invalid_argument
.
value
n'est pas modifié.
Si le motif a été trouvé, mais que la valeur analysée n'est pas dans la plage représentable par le type de
value
, retourne une valeur de type
std::from_chars_result
telle que
ec
est égal à
std::errc::result_out_of_range
et
ptr
pointe vers le premier caractère ne correspondant pas au motif.
value
n'est pas modifié.
Exceptions
Ne lance rien.
Notes
Contrairement aux autres fonctions d'analyse dans les bibliothèques C++ et C,
std::from_chars
est indépendant des paramètres régionaux, n'effectue pas d'allocation et ne lève pas d'exceptions. Seul un petit sous-ensemble des politiques d'analyse utilisées par d'autres bibliothèques (telles que
std::sscanf
) est fourni. Cela vise à permettre l'implémentation la plus rapide possible, utile dans des contextes courants à haut débit tels que l'échange de données textuelles (
JSON
ou
XML
).
La garantie que
std::from_chars
peut récupérer chaque valeur à virgule flottante formatée par
std::to_chars
exactement n'est fournie que si les deux fonctions proviennent de la même implémentation.
Un motif constitué d'un signe sans chiffres le suivant est traité comme un motif qui n'a rien correspondre.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_to_chars
|
201611L
|
(C++17) |
Conversions élémentaires de chaînes (
std::from_chars
,
std::to_chars
)
|
202306L
|
(C++26) | Test de réussite ou d'échec des fonctions <charconv> | |
__cpp_lib_constexpr_charconv
|
202207L
|
(C++23) |
Ajout des modificateurs
constexpr
aux surcharges de
std::from_chars
et
std::to_chars
pour les types entiers
|
Exemple
#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 << "Ceci n'est pas un nombre.\n"; else if (ec == std::errc::result_out_of_range) std::cout << "Ce nombre est plus grand qu'un int.\n"; } // Démonstration de from_char constexpr de C++23 / Démonstration de operator bool() de 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 }
Sortie :
String: "1234". Result: 1234, ptr -> "" String: "15 foo". Result: 15, ptr -> " foo" String: "bar". Ceci n'est pas un nombre. String: " 42". Ceci n'est pas un nombre. String: "5000000000". Ce nombre est plus grand qu'un int.
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 2955 | C++17 | cette fonction se trouvait dans <utility> et utilisait std::error_code | déplacée vers <charconv> et utilise std::errc |
| LWG 3373 | C++17 |
std::from_chars_result
pouvait avoir des membres supplémentaires
|
les membres supplémentaires sont interdits |
Voir aussi
|
(C++17)
|
le type de retour de
std::from_chars
(classe) |
|
(C++17)
|
convertit une valeur entière ou à virgule flottante en séquence de caractères
(fonction) |
|
(C++11)
(C++11)
(C++11)
|
convertit une chaîne en entier signé
(fonction) |
|
(C++11)
(C++11)
(C++11)
|
convertit une chaîne en valeur à virgule flottante
(fonction) |
|
(C++11)
|
convertit une chaîne d'octets en valeur entière
(fonction) |
|
convertit une chaîne d'octets en valeur à virgule flottante
(fonction) |
|
|
lit une entrée formatée depuis
stdin
, un flux de fichier ou un tampon
(fonction) |
|
|
extrait des données formatées
(fonction membre publique de
std::basic_istream<CharT,Traits>
)
|