std:: from_chars
|
ヘッダーで定義
<charconv>
|
||
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(1) |
(C++17以降)
(C++23以降constexpr) |
|
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) |
整数型に対する
std::from_chars
および
std::to_chars
オーバーロードへの
constexpr
修飾子の追加
|
例
#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のconstexpr from_charsデモ / C++26のoperator bool()デモ: 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>
の公開メンバ関数)
|