238 lines
35 KiB
HTML
238 lines
35 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>static_cast 转换</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_language_static_cast skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">static_cast 转换</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>用隐式和用户定义转换的组合在类型间转换。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><code><b>static_cast</b></code> <code><b><</b></code> <span class="t-spar">新类型</span> <code><b>></b></code> <code><b>(</b></code> <span class="t-spar">表达式</span> <code><b>)</b></code></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>返回 <span class="t-spar">新类型</span> 类型的值。</p>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<p>只有下列转换在不去除<i>常量性</i>或<i>易变性</i>的场合才能用 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 执行。</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 如果存在从 <span class="t-spar">表达式</span> 到 <span class="t-spar">新类型</span> 的<a href="cpp-language-implicit_conversion.html">隐式转换序列</a>,或者如果针对以 <span class="t-spar">表达式</span> 对 <span class="t-spar">新类型</span> 类型的对象或引用所进行的<a href="cpp-language-direct_initialization.html">直接初始化</a>的重载决议找到至少一个可行函数,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span><span class="sy1"><</span>新类型<span class="sy1">></span><span class="br0">(</span>表达式<span class="br0">)</span></span></span> 返回如同以 <span class="t-c"><span class="mw-geshi cpp source-cpp">新类型 Temp<span class="br0">(</span>表达式<span class="br0">)</span><span class="sy4">;</span></span></span> 所初始化的一个虚构变量 <code>Temp</code>,它可能涉及<a href="cpp-language-implicit_conversion.html">隐式转换</a>,对 <span class="t-spar">新类型</span> 的<a href="cpp-language-constructor.html">构造函数</a>的调用,或对<a href="cpp-language-cast_operator.html">用户定义转换运算符</a>的调用。<span class="t-rev-inl t-since-cxx17"><span>对于非引用的 <span class="t-spar">新类型</span>,<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 纯右值表达式的结果对象是其直接初始化的对象。</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span></div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 如果 <span class="t-spar">新类型</span> 是指向某类类型 <code>D</code> 的指针或引用,且 <span class="t-spar">表达式</span> 的类型是其非虚基类 <code>B</code> 的左值或指向它的指针纯右值,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 进行<i>向下转型(downcast)</i>。如果 <code>B</code> 是 <code>D</code> 的有歧义的,不可访问的或虚的基类(或虚基类的基类),则此向下转型非良构。这种 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 并不在运行时检查该对象的运行时类型确实为 <code>D</code>,因此它只能在该前提条件通过其他方法保证时,例如在实现<a href="https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern#Static_polymorphism" class="extiw" title="enwiki:Curiously recurring template pattern">静多态</a>时,才能安全使用。安全的向下转型可以用 <a href="cpp-language-dynamic_cast.html"><code>dynamic_cast</code></a> 执行。
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">struct</span> B <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> D <span class="sy4">:</span> B <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
D d<span class="sy4">;</span>
|
|
B<span class="sy3">&</span> br <span class="sy1">=</span> d<span class="sy4">;</span>
|
|
<span class="kw1">static_cast</span><span class="sy1"><</span>D<span class="sy3">&</span><span class="sy1">></span><span class="br0">(</span>br<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 该左值指代原来的 d 对象</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<div class="t-li1"><span class="t-li">3)</span> 如果 <span class="t-spar">新类型</span> 是右值引用类型,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 将<span class="t-rev-inl t-until-cxx17"><span>泛左值、类纯右值或数组纯右值</span> <span><span class="t-mark-rev t-until-cxx17">(C++17 前)</span></span></span><span class="t-rev-inl t-since-cxx17"><span>任何左值</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span> <span class="t-spar">表达式</span> 的值转换为与该表达式指代相同对象,或指代其基类子对象(取决于 <span class="t-spar">新类型</span>)的<i>亡值</i>。如果目标类型是表达式的不可访问或有歧义基类,则程序非良构。如果表达式是<a href="cpp-language-bit_field.html">位域</a>左值,则它首先被转换成底层类型的纯右值。这种 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 用于在 <span class="t-lc">std::move</span> 中实现移动语义。</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">4)</span> 如果 <span class="t-spar">新类型</span> 是(可为 cv 限定的)<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span> 类型,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 在求值 <span class="t-spar">表达式</span> 后舍弃其值。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> 如果存在从 <span class="t-spar">新类型</span> 到 <span class="t-spar">表达式</span> 类型的<a href="cpp-language-implicit_conversion.html">标准转换</a>序列,且它不包含左值到右值、数组到指针、函数到指针、空指针、空成员指针<span class="t-rev-inl t-since-cxx17"><span>、函数指针</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span>或布尔转换,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 能进行该隐式转换的逆转换。</div>
|
|
<div class="t-li1"><span class="t-li">6)</span> 如果从 <span class="t-spar">表达式</span> 到 <span class="t-spar">新类型</span> 的转换涉及左值到右值、数组到指针或函数到指针转换,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 可以显式执行该转换。</div>
|
|
<div class="t-li1"><span class="t-li">7)</span> <a href="cpp-language-enum.html">有作用域枚举</a>类型<span class="t-mark-rev t-since-cxx11">(C++11)</span>能转换成整数或浮点类型。
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx20">
|
|
<td>
|
|
<p>当目标类型为(可为 cv 限定的)<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> 类型时,如果原值为零则结果为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span>,而对所有其他值结果为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span>。对于其余整型类型,若该枚举的值能以目标类型表示,则结果为其值,否则结果未指明。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx20">(C++20 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<p>其结果与从枚举的底层类型<a href="cpp-language-implicit_conversion.html">隐式转换</a>成目标类型的结果相同。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li">8)</span> 整数或枚举类型值可转换为任何完整<a href="cpp-language-enum.html">枚举类型</a>。
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>如果底层类型不固定,则当 <span class="t-spar">表达式</span> 的值落在范围(范围是大到足以保有目标枚举的所有枚举项的最小位域的所有可能值)外时,则行为未定义。</li>
|
|
<li>如果底层类型固定,则其结果与<a href="cpp-language-implicit_conversion.html#.E6.95.B4.E6.95.B0.E7.B1.BB.E5.9E.8B.E8.BD.AC.E6.8D.A2">转换</a>原值到枚举的底层类型再到该枚举类型的结果相同。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li"></span> 浮点类型的值也可转换为任何完整枚举类型。
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>其结果与<a href="cpp-language-implicit_cast.html#Floating.E2.80.93integral_conversions" class="mw-redirect">转换</a>原值到枚举的底层类型再到该枚举类型的结果相同。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li">9)</span> 指向某类 <code>D</code> 的成员的指针可以向上转型(upcast)为指向其无歧义、可访问的基类 <code>B</code> 的成员。这种 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 不检查所指向对象的运行时类型是否包含该成员。</div>
|
|
<div class="t-li1"><span class="t-li">10)</span> 指向(可为 cv 限定的)<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span> 的指针类型的纯右值可转换到指向任何对象的指针类型。如果原<a href="cpp-language-pointer.html#.E6.8C.87.E9.92.88">指针值</a>所表示的内存中字节地址不满足目标类型的对齐要求,则结果指针值未指明。否则,如果原指针值指向对象 <i>a</i>,且存在与 <i>a</i> <i>指针可互转换</i>(定义于下文)的目标类型(忽略 cv 限定)的对象 <i>b</i>,则结果为指向 <i>b</i> 的指针。否则指针值不改变。任何指针转换到 void 指针再转换回原(或更为 cv 限定的)类型的指针,都保持其原值。</div>
|
|
<p>同所有转型表达式,结果是:</p>
|
|
<ul>
|
|
<li>左值,如果 <span class="t-spar">新类型</span> 是左值引用或到函数类型的右值引用;</li>
|
|
<li>亡值,如果 <span class="t-spar">新类型</span> 是到对象类型的右值引用;</li>
|
|
<li>否则为纯右值。</li>
|
|
</ul>
|
|
<p><span id=".E6.8C.87.E9.92.88.E5.8F.AF.E4.BA.92.E8.BD.AC.E6.8D.A2"></span>满足以下条件时,两个对象 <i>a</i> 与 <i>b</i> <i>指针可互转换(pointer-interconvertible)</i>:</p>
|
|
<ul>
|
|
<li>它们是同一个对象,或</li>
|
|
<li>一个是 union 对象而另一个是该对象的非静态数据成员,或</li>
|
|
<li>一个是<a href="cpp-language-data_members.html#.E6.A0.87.E5.87.86.E5.B8.83.E5.B1.80">标准布局</a>的类对象,而另一个是该对象的首个非静态数据成员,或如果该对象没有非静态数据成员,则为该对象的任何基类子对象,或</li>
|
|
<li>存在对象 <i>c</i> 使得 <i>a</i> 与 <i>c</i> 指针可互转换,而 <i>c</i> 与 <i>b</i> 指针可互转换。</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">union</span> U <span class="br0">{</span> <span class="kw4">int</span> a<span class="sy4">;</span> <span class="kw4">double</span> b<span class="sy4">;</span> <span class="br0">}</span> u<span class="sy4">;</span>
|
|
<span class="kw4">void</span><span class="sy2">*</span> x <span class="sy1">=</span> <span class="sy3">&</span>u<span class="sy4">;</span> <span class="co1">// x 的值为“指向 u 的指针”</span>
|
|
<span class="kw4">double</span><span class="sy2">*</span> y <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">double</span><span class="sy2">*</span><span class="sy1">></span><span class="br0">(</span>x<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// y 的值为“指向 u.b 的指针”</span>
|
|
<span class="kw4">char</span><span class="sy2">*</span> z <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">char</span><span class="sy2">*</span><span class="sy1">></span><span class="br0">(</span>x<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// z 的值为“指向 u 的指针”</span></pre></div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span></span></span> 也能用于通过进行到指定类型的函数到指针转换,来消解函数重载的歧义,如</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><a href="cpp-algorithm-for_each.html"><span class="kw1568">std::<span class="me2">for_each</span></span></a><span class="br0">(</span>files.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span>, files.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span>,
|
|
<span class="kw1">static_cast</span><span class="sy1"><</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&</span><span class="br0">(</span><span class="sy2">*</span><span class="br0">)</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&</span><span class="br0">)</span><span class="sy1">></span><span class="br0">(</span><a href="cpp-io-manip-flush.html"><span class="kw1790">std::<span class="me2">flush</span></span></a><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">关键词</span></h3>
|
|
<p><a href="cpp-keyword-static_cast.html"><tt>static_cast</tt></a></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 <vector></span>
|
|
<span class="co2">#include <iostream></span>
|
|
|
|
<span class="kw1">struct</span> B <span class="br0">{</span>
|
|
<span class="kw4">int</span> m <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
|
|
<span class="kw4">void</span> hello<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Hello world,这里是 B!<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> D <span class="sy4">:</span> B <span class="br0">{</span>
|
|
<span class="kw4">void</span> hello<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Hello world,这里是 D!<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw2">enum</span> <span class="kw1">class</span> E <span class="br0">{</span> ONE <span class="sy1">=</span> <span class="nu0">1</span>, TWO, THREE <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw2">enum</span> EU <span class="br0">{</span> ONE <span class="sy1">=</span> <span class="nu0">1</span>, TWO, THREE <span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="co1">// 1: 初始化转换</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="br0">(</span><span class="nu16">3.14</span><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> <span class="st0">"n = "</span> <span class="sy1"><<</span> n <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> v <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">>></span><span class="br0">(</span><span class="nu0">10</span><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> <span class="st0">"v.size() = "</span> <span class="sy1"><<</span> v.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 2: 静态向下转型</span>
|
|
D d<span class="sy4">;</span>
|
|
B<span class="sy3">&</span> br <span class="sy1">=</span> d<span class="sy4">;</span> <span class="co1">// 通过隐式转换向上转型</span>
|
|
br.<span class="me1">hello</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
D<span class="sy3">&</span> another_d <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span>D<span class="sy3">&</span><span class="sy1">></span><span class="br0">(</span>br<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 向下转型</span>
|
|
another_d.<span class="me1">hello</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 3: 左值到右值</span>
|
|
<a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> v2 <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="sy3">&&</span><span class="sy1">></span><span class="br0">(</span>v<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> <span class="st0">"移动后,v.size() = "</span> <span class="sy1"><<</span> v.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 4: 弃值表达式</span>
|
|
<span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">void</span><span class="sy1">></span><span class="br0">(</span>v2.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 5. 隐式转换的逆</span>
|
|
<span class="kw4">void</span><span class="sy2">*</span> nv <span class="sy1">=</span> <span class="sy3">&</span>n<span class="sy4">;</span>
|
|
<span class="kw4">int</span><span class="sy2">*</span> ni <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">int</span><span class="sy2">*</span><span class="sy1">></span><span class="br0">(</span>nv<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> <span class="st0">"*ni = "</span> <span class="sy1"><<</span> <span class="sy2">*</span>ni <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 6. 数组到指针后随向上转型</span>
|
|
D a<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="sy4">;</span>
|
|
B<span class="sy2">*</span> dp <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span>B<span class="sy2">*</span><span class="sy1">></span><span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 7. 有作用域枚举到 int 或 float</span>
|
|
E e <span class="sy1">=</span> E<span class="sy4">::</span><span class="me2">ONE</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> one <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="br0">(</span>e<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> one <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 8. int 到枚举,枚举到另一枚举</span>
|
|
E e2 <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span>E<span class="sy1">></span><span class="br0">(</span>one<span class="br0">)</span><span class="sy4">;</span>
|
|
EU eu <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span>EU<span class="sy1">></span><span class="br0">(</span>e2<span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 9. 指向成员指针向上转型</span>
|
|
<span class="kw4">int</span> D<span class="sy4">::</span><span class="sy2">*</span>pm <span class="sy1">=</span> <span class="sy3">&</span>D<span class="sy4">::</span><span class="me2">m</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> br.<span class="sy2">*</span><span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">int</span> B<span class="sy4">::</span><span class="sy2">*</span><span class="sy1">></span><span class="br0">(</span>pm<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 10. void* 到任何类型</span>
|
|
<span class="kw4">void</span><span class="sy2">*</span> voidp <span class="sy1">=</span> <span class="sy3">&</span>e<span class="sy4">;</span>
|
|
<a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="sy2">*</span> p <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="sy2">*</span><span class="sy1">></span><span class="br0">(</span>voidp<span class="br0">)</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">n = 3
|
|
v.size() = 10
|
|
Hello world,这里是 B!
|
|
Hello world,这里是 D!
|
|
移动后,v.size() = 0
|
|
*ni = 3
|
|
1
|
|
0</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://wg21.cmeerw.net/cwg/issue2254">CWG 2254</a></td>
|
|
<td>C++11</td>
|
|
<td>无数据成员的标准布局类对象可指针间转换到其首个基类</td>
|
|
<td>可指针间转换到其任何基类</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<ul>
|
|
<li><a href="cpp-language-const_cast.html"><code>const_cast</code></a></li>
|
|
<li><a href="cpp-language-dynamic_cast.html"><code>dynamic_cast</code></a></li>
|
|
<li><a href="cpp-language-reinterpret_cast.html"><code>reinterpret_cast</code></a></li>
|
|
<li><a href="cpp-language-explicit_cast.html">显式转型</a></li>
|
|
<li><a href="cpp-language-implicit_conversion.html">隐式转换</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|