281 lines
23 KiB
HTML
281 lines
23 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>std::from_chars, std::from_chars_result</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_utility_from_chars skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>from_chars, <span style="font-size:0.7em; line-height:130%">std::</span>from_chars_result</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-utility.html">utility</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-charconv.html"><charconv></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">from_chars_result</span> from_chars<span class="br0">(</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> first, <span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> last,<br />
|
|
<span class="coMULTI">/*see below*/</span><span class="sy3">&</span> value, <span class="kw4">int</span> base <span class="sy1">=</span> <span class="nu0">10</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">from_chars_result</span> from_chars<span class="br0">(</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> first, <span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> last, <span class="kw4">float</span><span class="sy3">&</span> value,<br />
|
|
std<span class="sy4">::</span><span class="me2">chars_format</span> fmt <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">chars_format</span><span class="sy4">::</span><span class="me2">general</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">from_chars_result</span> from_chars<span class="br0">(</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> first, <span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> last, <span class="kw4">double</span><span class="sy3">&</span> value,<br />
|
|
std<span class="sy4">::</span><span class="me2">chars_format</span> fmt <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">chars_format</span><span class="sy4">::</span><span class="me2">general</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">from_chars_result</span> from_chars<span class="br0">(</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> first, <span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> last, <span class="kw4">long</span> <span class="kw4">double</span><span class="sy3">&</span> value,<br />
|
|
std<span class="sy4">::</span><span class="me2">chars_format</span> fmt <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">chars_format</span><span class="sy4">::</span><span class="me2">general</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>辅助类型</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">struct</span> from_chars_result <span class="br0">{</span><br /></span>
|
|
<p> <span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> ptr<span class="sy4">;</span><br />
|
|
<a href="cpp-error-errc.html"><span class="kw880">std::<span class="me2">errc</span></span></a> ec<span class="sy4">;</span><br /></p>
|
|
<span class="br0">}</span><span class="sy4">;</span></div>
|
|
</td>
|
|
<td>(5)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>按照后述模式分析字符序列 <code>[first,last)</code> 。若无字符匹配模式或若按照分析匹配字符获得的值不能以 <code>value</code> 的类型表示,则不修改 <code>value</code> ,否则将匹配模式的字符转译成算术值的文本表示,并将值存储于 <code>value</code> 。</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 整数分析函数:期待等同于 <span class="t-lc"><a href="cpp-string-byte-strtol.html">std::strtol</a></span> 于默认( "C" )本地环境所使用者相同的模式,并给定非零整数底,除了
|
|
<ul>
|
|
<li>对底 16 不识别 "0x" 或 "0X" 前缀</li>
|
|
<li>仅识别负号(不识别正号),而且只针对 <code>value</code> 的有符号整数类型。</li>
|
|
</ul>
|
|
库为所有有符号和无符号整数类型和 <code>char</code> 提供重载,这些类型是参数 <code>value</code> 的被引用类型。</div>
|
|
<div class="t-li1"><span class="t-li">2-4)</span> 浮点分析函数:期待期待等同于 <span class="t-lc"><a href="cpp-string-byte-strtof.html">std::strtod</a></span> 于默认( "C" )本地环境所使用者相同的模式,除了
|
|
<ul>
|
|
<li>不识别指数外的正号(在起始位置只允许出现负号)</li>
|
|
<li>若 <code>fmt</code> 设置了 <a href="cpp-utility-chars_format.html"><tt>std::chars_format::scientific</tt></a> 而无 <a href="cpp-utility-chars_format.html"><tt>std::chars_format::fixed</tt></a> ,则要求指数部分(否则可选)</li>
|
|
<li>若 <code>fmt</code> 设置了 <a href="cpp-utility-chars_format.html"><tt>std::chars_format::fixed</tt></a> 而无 <a href="cpp-utility-chars_format.html"><tt>std::chars_format::scientific</tt></a> ,则不允许可选的指数部分</li>
|
|
<li>若 <code>fmt</code> 为 <a href="cpp-utility-chars_format.html"><tt>std::chars_format::hex</tt></a> ,则不允许前缀 "0x" 或 "0X" (字符串 "0x123" 分析为值 "0" 和未分析的剩余 "x123" )。</li>
|
|
</ul>
|
|
任何情况下,按照 <span class="t-lc"><a href="cpp-types-numeric_limits-float_round_style.html">std::round_to_nearest</a></span> 舍入后,结果值是至多二个最接近匹配模式的字符串的值的浮点值之一。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> 返回值类型(见后述返回值)。 <code>std::from_chars_result</code> 无基类或 <code>ptr</code> 、 <code>ec</code> 及隐式声明的特殊成员函数以外的成员。</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>first, last</td>
|
|
<td>-</td>
|
|
<td>要分析的合法字符范围</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>value</td>
|
|
<td>-</td>
|
|
<td>存储被分析值的输出参数,若分析成功</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>base</td>
|
|
<td>-</td>
|
|
<td>使用的整数基底: 2 与 36 间的值(含上下限)。</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>fmt</td>
|
|
<td>-</td>
|
|
<td>使用的浮点格式, <a href="cpp-utility-chars_format.html"><tt>std::chars_format</tt></a> 类型的位掩码</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>成功时,返回 <code>from_chars_result</code> 类型的值,其 <code>ptr</code> 指向首个不匹配模式的字符,或若所有字符皆匹配则指向拥有等于 <code>last</code> 的值,其 <code>ec</code> 被值初始化。</p>
|
|
<p>若无可匹配的模式,则返回 <code>from_chars_result</code> 类型的值,其 <code>ptr</code> 等于 <code>first</code> 且 <code>ec</code> 等于 <span class="t-lc"><a href="cpp-error-errc.html">std::errc::invalid_argument</a></span> 。不修改 <code>value</code> 。</p>
|
|
<p>若模式匹配,但被分析值不在 <code>value</code> 的类型所表示的范围内,则返回 <code>from_chars_result</code> 类型的值,其 <code>ec</code> 等于 <span class="t-lc"><a href="cpp-error-errc.html">std::errc::result_out_of_range</a></span> 且 <code>ptr</code> 指向首个不匹配模式的字符。不修改 <code>value</code> 。</p>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="operator.3D.3D.28std::from_chars_result.29">operator==<small>(std::from_chars_result)</small></span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl t-since-cxx20">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">friend</span> <span class="kw4">bool</span> operator<span class="sy1">==</span><span class="br0">(</span> <span class="kw4">const</span> from_chars_result<span class="sy3">&</span>,<br />
|
|
<span class="kw4">const</span> from_chars_result<span class="sy3">&</span> <span class="br0">)</span> <span class="sy1">=</span> <span class="kw1">default</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>检查两个参数的 <code>ptr</code> 与 <code>ec</code> 是否分别相等。</p>
|
|
<p>此函数对通常<a href="cpp-language-unqualified_lookup.html">无限定</a>或<a href="cpp-language-qualified_lookup.html">有限定查找</a>不可见,而只能在 <code>std::from_chars_result</code> 为参数的关联类时由<a href="cpp-language-adl.html">实参依赖查找</a>找到。</p>
|
|
<p><code>!=</code> 运算符从 <code>operator==</code> <a href="cpp-language-operators.html#.E5.85.B3.E7.B3.BB.E8.BF.90.E7.AE.97.E7.AC.A6">合成</a>。</p>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.82.E5.B8.B8">异常</span></h3>
|
|
<p>不抛出。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>不同于 C++ 和 C 库中的其他格式化函数, <code>std::from_chars</code> 是独立于本地环境、不分配、不抛出的。它只提供其他库(例如 <span class="t-lc"><a href="cpp-io-c-fscanf.html">std::sscanf</a></span> )所用策略的一个小子集。它的目的是在常见的高吞吐量环境,例如基于文本的交换( JSON 或 XML )中,允许尽可能快的实现。</p>
|
|
<p>仅当两个函数都来自同一实现的情况下,才保证 <span class="t-lc">std::from_chars</span> 能恢复每个由 <code>to_chars</code> 格式化的浮点值。</p>
|
|
<p>由无后随数位的符号组成的模式被当做不匹配任何内容的模式。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <charconv></span>
|
|
<span class="co2">#include <array></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-container-array.html"><span class="kw1268">std::<span class="me2">array</span></span></a><span class="sy1"><</span><span class="kw4">char</span>, <span class="nu0">10</span><span class="sy1">></span> str<span class="br0">{</span><span class="st0">"42"</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> result<span class="sy4">;</span>
|
|
std<span class="sy4">::</span><span class="me2">from_chars</span><span class="br0">(</span> str.<span class="me1">data</span><span class="br0">(</span><span class="br0">)</span>, str.<span class="me1">data</span><span class="br0">(</span><span class="br0">)</span><span class="sy2">+</span>str.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span>,result <span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> result<span class="sy4">;</span>
|
|
<span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">42</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue2955">LWG 2955</a></td>
|
|
<td>C++17</td>
|
|
<td>此函数在 <utility> 并使用 <span class="t-lc"><a href="cpp-error-error_code.html">std::error_code</a></span></td>
|
|
<td>移动到 <charconv> 并使用 <span class="t-lc"><a href="cpp-error-errc.html">std::errc</a></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue3373">LWG 3373</a></td>
|
|
<td>C++17</td>
|
|
<td><code>from_chars_result</code> 可能拥有额外的成员</td>
|
|
<td>禁止额外的成员</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-to_chars.html"><span class="t-lines"><span>to_chars</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx17">(C++17)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>转换整数或浮点值到字符序列<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-string-basic_string-stol.html"><span class="t-lines"><span>stoi</span><span>stol</span><span>stoll</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>转换字符串为有符号整数<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-string-basic_string-stof.html"><span class="t-lines"><span>stof</span><span>stod</span><span>stold</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>转换字符串为浮点值<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-string-byte-strtol.html"><span class="t-lines"><span>strtol</span><span>strtoll</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>转换字节字符串为整数值<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-string-byte-strtof.html"><span class="t-lines"><span>strtof</span><span>strtod</span><span>strtold</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>转换字节字符串为浮点值<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-c-fscanf.html"><span class="t-lines"><span>scanf</span><span>fscanf</span><span>sscanf</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>从 <span class="t-lc"><a href="cpp-io-c.html">stdin</a></span>、文件流或缓冲区读取有格式输入<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-basic_istream-operator_gtgt.html"><span class="t-lines"><span>operator>></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>提取带格式数据<br />
|
|
<span class="t-mark">(<code>std::basic_istream<CharT,Traits></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|