﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天蓝向上-随笔分类-C++11</title><link>http://www.cppblog.com/tianbianlan/category/20512.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 05 May 2013 13:30:41 GMT</lastBuildDate><pubDate>Sun, 05 May 2013 13:30:41 GMT</pubDate><ttl>60</ttl><item><title>[转]The Biggest Changes in C++11 </title><link>http://www.cppblog.com/tianbianlan/archive/2013/05/05/199992.html</link><dc:creator>天边蓝</dc:creator><author>天边蓝</author><pubDate>Sun, 05 May 2013 13:26:00 GMT</pubDate><guid>http://www.cppblog.com/tianbianlan/archive/2013/05/05/199992.html</guid><wfw:comment>http://www.cppblog.com/tianbianlan/comments/199992.html</wfw:comment><comments>http://www.cppblog.com/tianbianlan/archive/2013/05/05/199992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tianbianlan/comments/commentRss/199992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tianbianlan/services/trackbacks/199992.html</trackback:ping><description><![CDATA[http://coolshell.cn/articles/5265.html<br />
<p>源文章来自前C++标准委员会的&nbsp;<a href="http://www.softwarequalityconnection.com/author/dannykalev/">Danny Kalev</a>&nbsp;的&nbsp;<a href="http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/" target="_blank">The Biggest Changes in C++11 (and Why You Should Care)</a>，赖勇浩做了一个<a href="http://blog.csdn.net/lanphaday/article/details/6564162" target="_blank">中文翻译在这里</a>。所以，我就不翻译了，我在这里仅对文中提到的这些变化&#8220;<strong>追问为什么要引入这些变化</strong>&#8221;的一个探讨，<strong>只有知道为了什么，用在什么地方，我们才能真正学到这个知识</strong>。而以此你可以更深入地了解这些变化。所以，本文不是翻译。因为写得有些仓促，所以难免有问题，还请大家指正。</p>
<h4 class="color-programming"><a name="t0"></a>Lambda 表达式</h4>
<p>Lambda表达式来源于函数式编程，说白就了就是在使用的地方定义函数，有的语言叫&#8220;闭包&#8221;，如果 lambda 函数没有传回值(例如&nbsp;<tt>void</tt>&nbsp;)，其回返类型可被完全忽略。 定义在与 lambda 函数相同作用域的变量参考也可以被使用。这种的变量集合一般被称作 closure（闭包）。我在这里就不再讲这个事了。表达式的简单语法如下，</p>
<div>
<div id="highlighter_749642" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">[capture](parameters)-&gt;return_type {body}</code></div></div></td></tr></tbody></table></div></div>
<p>原文的作者给出了下面的例子：</p>
<div>
<div id="highlighter_570026" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp color1 bold">int</code> <code class="cpp plain">main()</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code><code class="cpp color1 bold">char</code> <code class="cpp plain">s[]=</code><code class="cpp string">"Hello World!"</code><code class="cpp plain">;</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code><code class="cpp color1 bold">int</code> <code class="cpp plain">Uppercase = 0; </code><code class="cpp comments">//modified by the lambda</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">for_each(s, s+</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(s), [&amp;Uppercase] (</code><code class="cpp color1 bold">char</code> <code class="cpp plain">c) {</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp keyword bold">if</code> <code class="cpp plain">(</code><code class="cpp functions bold">isupper</code><code class="cpp plain">(c))</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">Uppercase++;</code></div>
<div class="line number8 index7 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">});</code></div>
<div class="line number9 index8 alt2"><code class="cpp spaces">&nbsp;</code><code class="cpp plain">cout &lt;&lt; Uppercase &lt;&lt; </code><code class="cpp string">" uppercase letters in: "</code> <code class="cpp plain">&lt;&lt; s &lt;&lt;endl;</code></div>
<div class="line number10 index9 alt1"><code class="cpp plain">}</code></div></div></td></tr></tbody></table></div></div>
<p>在传统的STL中for_each() 这个玩意最后那个参数需要一个&#8220;函数对象&#8221;，所谓函数对象，其实是一个class，这个class重载了operator()，于是这个对象可以像函数的式样的使用。实现一个函数对象并不容易，需要使用template，比如下面这个例子就是函数对象的简单例子（实际的实现远比这个复杂）：</p>
<p><span id="more-5265"></span></p>
<div>
<div id="highlighter_676447" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp keyword bold">class</code> <code class="cpp plain">T&gt;</code></div>
<div class="line number2 index1 alt1"><code class="cpp keyword bold">class</code> <code class="cpp plain">less</code></div>
<div class="line number3 index2 alt2"><code class="cpp plain">{</code></div>
<div class="line number4 index3 alt1"><code class="cpp keyword bold">public</code><code class="cpp plain">:</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp color1 bold">bool</code> <code class="cpp plain">operator()(</code><code class="cpp keyword bold">const</code> <code class="cpp plain">T&amp;l, </code><code class="cpp keyword bold">const</code> <code class="cpp plain">T&amp;r)</code><code class="cpp keyword bold">const</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">{</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp keyword bold">return</code> <code class="cpp plain">l &lt; r;</code></div>
<div class="line number8 index7 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">}</code></div>
<div class="line number9 index8 alt2"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<p class="color-programming">所以，<strong>C++引入Lambda的最主要原因就是1）可以定义匿名函数，2）编译器会把其转成函数对象</strong>。相信你会和我一样，会疑问为什么以前STL中的ptr_fun()这个函数对象不能用？（ptr_fun()就是把一个自然函数转成函数对象的）。原因是，ptr_fun() 的局限是其接收的自然函数只能有1或2个参数。</p>
<p class="color-programming">那么，除了方便外，为什么一定要使用Lambda呢？它比传统的函数或是函数对象有什么好处呢？我个人所理解的是，这种函数之年以叫&#8220;闭包&#8221;，就是因为其限制了别人的访问，更私有。也可以认为他是一次性的方法。Lambda表达式应该是简洁的，极私有的，为了更易的代码和更方便的编程。</p>
<h4 class="color-programming"><a name="t1"></a>自动类型推导 auto</h4>
<p>在这一节中，原文主要介绍了两个关键字 auto 和 deltype，示例如下：</p>
<div>
<div id="highlighter_404721" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">auto x=0; </code><code class="cpp comments">//x has type int because 0 is int</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">auto c=</code><code class="cpp string">'a'</code><code class="cpp plain">; </code><code class="cpp comments">//char</code></div>
<div class="line number3 index2 alt2"><code class="cpp plain">auto d=0.5; </code><code class="cpp comments">//double</code></div>
<div class="line number4 index3 alt1"><code class="cpp plain">auto national_debt=14400000000000LL;</code><code class="cpp comments">//long long</code></div></div></td></tr></tbody></table></div></div>
<p>auto 最大的好处就是让代码简洁，尤其是那些模板类的声明，比如：STL中的容器的迭代子类型。</p>
<div>
<div id="highlighter_275794" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">vector&lt;</code><code class="cpp color1 bold">int</code><code class="cpp plain">&gt;::const_iterator ci = vi.begin();</code></div></div></td></tr></tbody></table></div></div>
<p>可以变成：</p>
<div>
<div id="highlighter_372866" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">auto ci = vi.begin();</code></div></div></td></tr></tbody></table></div></div>
<p>模板这个特性让C++的代码变得很难读，不信你可以看看STL的源码，那是一个乱啊。使用auto必需一个初始化值，编译器可以通过这个初始化值推导出类型。因为auto是来简化模板类引入的代码难读的问题，如上面的示例，iteration这种类型就最适合用auto的，但是，我们不应该把其滥用。</p>
<p>比如下面的代码的可读性就降低了。因为，我不知道ProcessData返回什么？int? bool? 还是对象？或是别的什么？这让你后面的程序不知道怎么做。</p>
<div>
<div id="highlighter_652563" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">auto obj = ProcessData(someVariables);</code></div></div></td></tr></tbody></table></div></div>
<p>但是下面的程序就没有问题，因为pObject的型别在后面的new中有了。</p>
<div>
<div id="highlighter_665966" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">auto pObject = </code><code class="cpp keyword bold">new</code> <code class="cpp plain">SomeType&lt;OtherType&gt;::SomeOtherType();</code></div></div></td></tr></tbody></table></div></div>
<h4><a name="t2"></a>自动化推导 decltype</h4>
<p>关于&nbsp;<code>decltype</code>&nbsp;是一个操作符，其可以评估括号内表达式的类型，其规则如下：</p>
<ol><li>如果表达式e是一个变量，那么就是这个变量的类型。</li><li>如果表达式e是一个函数，那么就是这个函数返回值的类型。</li><li>如果不符合1和2，如果e是左值，类型为T，那么decltype(e)是T&amp;；如果是右值，则是T。</li></ol>
<p>原文给出的示例如下，我们可以看到，这个让的确我们的定义变量省了很多事。</p>
<div>
<div id="highlighter_595885" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">const</code> <code class="cpp plain">vector&lt;</code><code class="cpp color1 bold">int</code><code class="cpp plain">&gt; vi;</code></div>
<div class="line number2 index1 alt1"><code class="cpp keyword bold">typedef</code> <code class="cpp plain">decltype (vi.begin()) CIT;</code></div>
<div class="line number3 index2 alt2"><code class="cpp plain">CIT another_const_iterator;</code></div></div></td></tr></tbody></table></div></div>
<p>还有一个适合的用法是用来typedef函数指针，也会省很多事。比如：</p>
<div>
<div id="highlighter_651396" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">decltype(&amp;myfunc) pfunc = 0;</code></div>
<div class="line number2 index1 alt1">&nbsp;</div>
<div class="line number3 index2 alt2"><code class="cpp keyword bold">typedef</code> <code class="cpp plain">decltype(&amp;A::func1) type;</code></div></div></td></tr></tbody></table></div></div>
<h4><a name="t3"></a>auto 和 decltype 的差别和关系</h4>
<p><a href="http://en.wikipedia.org/wiki/C%2B%2B0x#Type_inference" rel="nofollow" target="_blank">Wikipedia 上是这么说的</a>（关于decltype的规则见上）</p>
<div>
<div id="highlighter_153422" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp preprocessor">#include &lt;vector&gt;</code></div>
<div class="line number2 index1 alt1">&nbsp;</div>
<div class="line number3 index2 alt2"><code class="cpp color1 bold">int</code> <code class="cpp plain">main()</code></div>
<div class="line number4 index3 alt1"><code class="cpp plain">{</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp keyword bold">const</code> <code class="cpp plain">std::vector&lt;</code><code class="cpp color1 bold">int</code><code class="cpp plain">&gt; v(1);</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">auto a = v[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code class="cpp comments">// a 的类型是 int</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">decltype(v[0]) b = 1; </code><code class="cpp comments">// b 的类型是 const int&amp;, 因为函数的返回类型是</code></div>
<div class="line number8 index7 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// std::vector&lt;int&gt;::operator[](size_type) const</code></div>
<div class="line number9 index8 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">auto c = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code class="cpp comments">// c 的类型是 int</code></div>
<div class="line number10 index9 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">auto d = c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code class="cpp comments">// d 的类型是 int</code></div>
<div class="line number11 index10 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">decltype(c) e;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code class="cpp comments">// e 的类型是 int, 因为 c 的类型是int</code></div>
<div class="line number12 index11 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">decltype((c)) f = c;&nbsp; </code><code class="cpp comments">// f 的类型是 int&amp;, 因为 (c) 是左值</code></div>
<div class="line number13 index12 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">decltype(0) g;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code class="cpp comments">// g 的类型是 int, 因为 0 是右值</code></div>
<div class="line number14 index13 alt1"><code class="cpp plain">}</code></div></div></td></tr></tbody></table></div></div>
<p>如果auto 和 decltype 在一起使用会是什么样子？能看下面的示例，下面这个示例也是引入decltype的一个原因&#8212;&#8212;让C++有能力写一个 &#8220; <a title="Wrapper function" href="http://en.wikipedia.org/wiki/Wrapper_function">forwarding function</a>&nbsp;模板&#8221;，</p>
<div>
<div id="highlighter_45354" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code><code class="cpp plain">&lt; </code><code class="cpp keyword bold">typename</code> <code class="cpp plain">LHS, </code><code class="cpp keyword bold">typename</code> <code class="cpp plain">RHS&gt;</code></div>
<div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">auto AddingFunc(</code><code class="cpp keyword bold">const</code> <code class="cpp plain">LHS &amp;lhs, </code><code class="cpp keyword bold">const</code> <code class="cpp plain">RHS &amp;rhs) -&gt; decltype(lhs+rhs)</code></div>
<div class="line number3 index2 alt2"><code class="cpp plain">{</code><code class="cpp keyword bold">return</code> <code class="cpp plain">lhs + rhs;}</code></div></div></td></tr></tbody></table></div></div>
<p>这个函数模板看起来相当费解，其用到了auto 和 decltype 来扩展了已有的模板技术的不足。怎么个不足呢？在上例中，我不知道AddingFunc会接收什么样类型的对象，这两个对象的 + 操作符返回的类型也不知道，老的模板函数无法定义AddingFunc返回值和这两个对象相加后的返回值匹配，所以，你可以使用上述的这种定义。</p>
<h4 class="color-programming"><a name="t4"></a>统一的初始化语法</h4>
<p>C/C++的初始化的方法比较，C++ 11 用大括号统一了这些初始化的方法。</p>
<p>比如：POD的类型。</p>
<div>
<div id="highlighter_178137" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp color1 bold">int</code> <code class="cpp plain">arr[4]={0,1,2,3};</code></div>
<div class="line number2 index1 alt1"><code class="cpp keyword bold">struct</code> <code class="cpp color1 bold">tm</code> <code class="cpp plain">today={0};</code></div></div></td></tr></tbody></table></div></div>
<p>关于POD相说两句，所谓POD就是<a href="http://en.wikipedia.org/wiki/Plain_Old_Data_Structures" target="_blank">Plain Old Data</a>，当class/struct是<em>极简的(trivial)</em>、属于<em>标准布局(standard-layout)</em>，以及他的所有非静态（non-static）成员都是POD时，会被视为POD。如：</p>
<div>
<div id="highlighter_451730" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">struct</code> <code class="cpp plain">A { </code><code class="cpp color1 bold">int</code> <code class="cpp plain">m; }; </code><code class="cpp comments">// POD</code></div>
<div class="line number2 index1 alt1"><code class="cpp keyword bold">struct</code> <code class="cpp plain">B { ~B(); </code><code class="cpp color1 bold">int</code> <code class="cpp plain">m; }; </code><code class="cpp comments">// non-POD, compiler generated default ctor</code></div>
<div class="line number3 index2 alt2"><code class="cpp keyword bold">struct</code> <code class="cpp plain">C { C() : m() {}; ~C(); </code><code class="cpp color1 bold">int</code> <code class="cpp plain">m; }; </code><code class="cpp comments">// non-POD, default-initialising m</code></div></div></td></tr></tbody></table></div></div>
<p>POD的初始化有点怪，比如上例，new A; 和new A(); 是不一样的，对于其内部的m，前者没有被初始化，后者被初始化了（不同 的编译器行为不一样，VC++和GCC不一样）。而非POD的初始化，则都会被初始化。</p>
<p>从这点可以看出，C/C++的初始化问题很奇怪，所以，在C++ 2011版中就做了统一。原文作者给出了如下的示例：</p>
<div>
<div id="highlighter_506998" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">C c {0,0}; </code><code class="cpp comments">//C++11 only. 相当于: C c(0,0);</code></div>
<div class="line number2 index1 alt1">&nbsp;</div>
<div class="line number3 index2 alt2"><code class="cpp color1 bold">int</code><code class="cpp plain">* a = </code><code class="cpp keyword bold">new</code> <code class="cpp color1 bold">int</code><code class="cpp plain">[3] { 1, 2, 0 }; /C++11 only</code></div>
<div class="line number4 index3 alt1">&nbsp;</div>
<div class="line number5 index4 alt2"><code class="cpp keyword bold">class</code> <code class="cpp plain">X {</code></div>
<div class="line number6 index5 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp color1 bold">int</code> <code class="cpp plain">a[4];</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp keyword bold">public</code><code class="cpp plain">:</code></div>
<div class="line number8 index7 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">X() : a{1,2,3,4} {} </code><code class="cpp comments">//C++11, member array initializer</code></div>
<div class="line number9 index8 alt2"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<p>容器的初始化：</p>
<div>
<div id="highlighter_261648" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp comments">// C++11 container initializer</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">vector&lt;string&gt; vs={ </code><code class="cpp string">"first"</code><code class="cpp plain">, </code><code class="cpp string">"second"</code><code class="cpp plain">, </code><code class="cpp string">"third"</code><code class="cpp plain">};</code></div>
<div class="line number3 index2 alt2"><code class="cpp plain">map singers =</code></div>
<div class="line number4 index3 alt1"><code class="cpp plain">{ {</code><code class="cpp string">"Lady Gaga"</code><code class="cpp plain">, </code><code class="cpp string">"+1 (212) 555-7890"</code><code class="cpp plain">},</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">{</code><code class="cpp string">"Beyonce Knowles"</code><code class="cpp plain">, </code><code class="cpp string">"+1 (212) 555-0987"</code><code class="cpp plain">}};</code></div></div></td></tr></tbody></table></div></div>
<p>还支持像Java一样的成员初始化：</p>
<div>
<div id="highlighter_296330" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">class</code> <code class="cpp plain">C</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code><code class="cpp color1 bold">int</code> <code class="cpp plain">a=7; </code><code class="cpp comments">//C++11 only</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;</code><code class="cpp keyword bold">public</code><code class="cpp plain">:</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">C();</code></div>
<div class="line number6 index5 alt1"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<h4 class="color-programming"><a name="t5"></a>Delete 和 Default 函数</h4>
<p>我们知道C++的编译器在你没有定义某些成员函数的时候会给你的类自动生成这些函数，比如，构造函数，拷贝构造，析构函数，赋值函数。有些时候，我们不想要这些函数，比如，构造函数，因为我们想做实现单例模式。传统的做法是将其声明成private类型。</p>
<p>在新的C++中引入了两个指示符，delete意为告诉编译器不自动产生这个函数，default告诉编译器产生一个默认的。原文给出了下面两个例子：</p>
<div>
<div id="highlighter_727542" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">struct</code> <code class="cpp plain">A</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">A()=</code><code class="cpp keyword bold">default</code><code class="cpp plain">; </code><code class="cpp comments">//C++11</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp keyword bold">virtual</code> <code class="cpp plain">~A()=</code><code class="cpp keyword bold">default</code><code class="cpp plain">; </code><code class="cpp comments">//C++11</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<p>再如delete</p>
<div>
<div id="highlighter_968982" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">struct</code> <code class="cpp plain">NoCopy</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">NoCopy &amp; operator =( </code><code class="cpp keyword bold">const</code> <code class="cpp plain">NoCopy &amp; ) = </code><code class="cpp keyword bold">delete</code><code class="cpp plain">;</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">NoCopy ( </code><code class="cpp keyword bold">const</code> <code class="cpp plain">NoCopy &amp; ) = </code><code class="cpp keyword bold">delete</code><code class="cpp plain">;</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">};</code></div>
<div class="line number6 index5 alt1"><code class="cpp plain">NoCopy a;</code></div>
<div class="line number7 index6 alt2"><code class="cpp plain">NoCopy b(a); </code><code class="cpp comments">//compilation error, copy ctor is deleted</code></div></div></td></tr></tbody></table></div></div>
<p>这里，我想说一下，为什么我们需要default？我什么都不写不就是default吗？不全然是，比如构造函数，因为只要你定义了一个构造函数，编译器就不会给你生成一个默认的了。所以，为了要让默认的和自定义的共存，才引入这个参数，如下例所示：</p>
<div>
<div id="highlighter_726892" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">struct</code> <code class="cpp plain">SomeType</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;</code><code class="cpp plain">SomeType() = </code><code class="cpp keyword bold">default</code><code class="cpp plain">; </code><code class="cpp comments">// 使用编译器生成的默认构造函数</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;</code><code class="cpp plain">SomeType(OtherType value);</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<p>关于delete还有两个有用的地方是</p>
<p>1）让你的对象只能生成在栈内存上：</p>
<div>
<div id="highlighter_64998" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">struct</code> <code class="cpp plain">NonNewable {</code></div>
<div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp keyword bold">void</code> <code class="cpp plain">*operator </code><code class="cpp keyword bold">new</code><code class="cpp plain">(std::</code><code class="cpp color1 bold">size_t</code><code class="cpp plain">) = </code><code class="cpp keyword bold">delete</code><code class="cpp plain">;</code></div>
<div class="line number3 index2 alt2"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<p>2）阻止函数的其形参的类型调用：（若尝试以 double 的形参调用&nbsp;<code>f()</code>，将会引发编译期错误， 编译器不会自动将 double 形参转型为 int 再调用<code>f()</code>，如果传入的参数是double，则会出现编译错误）</p>
<div>
<div id="highlighter_100259" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">f(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">i);</code></div>
<div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;</code><code class="cpp keyword bold">void</code> <code class="cpp plain">f(</code><code class="cpp color1 bold">double</code><code class="cpp plain">) = </code><code class="cpp keyword bold">delete</code><code class="cpp plain">;</code></div></div></td></tr></tbody></table></div></div>
<h4 class="color-programming"><a name="t6"></a>nullptr</h4>
<p>C/C++的NULL宏是个被有很多潜在BUG的宏。因为有的库把其定义成整数0，有的定义成 (void*)0。在C的时代还好。但是在C++的时代，这就会引发很多问题。你可以上网看看。这是为什么需要&nbsp;<code>nullptr</code>&nbsp;的原因。&nbsp;<code>nullptr</code>&nbsp;是强类型的。</p>
<div>
<div id="highlighter_74048" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">f(</code><code class="cpp color1 bold">int</code><code class="cpp plain">); </code><code class="cpp comments">//#1</code></div>
<div class="line number2 index1 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">f(</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*);</code><code class="cpp comments">//#2</code></div>
<div class="line number3 index2 alt2"><code class="cpp comments">//C++03</code></div>
<div class="line number4 index3 alt1"><code class="cpp plain">f(0); </code><code class="cpp comments">//二义性</code></div>
<div class="line number5 index4 alt2"><code class="cpp comments">//C++11</code></div>
<div class="line number6 index5 alt1"><code class="cpp plain">f(nullptr) </code><code class="cpp comments">//无二义性，调用f(char*)</code></div></div></td></tr></tbody></table></div></div>
<p><code>所以在新版中请以 nullptr</code> 初始化指针。</p>
<h4 class="color-programming"><a name="t7"></a>委托构造</h4>
<p>在以前的C++中，构造函数之间不能互相调用，所以，我们在写这些相似的构造函数里，我们会把相同的代码放到一个私有的成员函数中。</p>
<div>
<div id="highlighter_600326" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">class</code> <code class="cpp plain">SomeType {</code></div>
<div class="line number2 index1 alt1"><code class="cpp keyword bold">private</code><code class="cpp plain">:</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp color1 bold">int</code> <code class="cpp plain">number;</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">string name;</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">SomeType( </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i, string&amp;amp; s ) : number(i), name(s){}</code></div>
<div class="line number6 index5 alt1"><code class="cpp keyword bold">public</code><code class="cpp plain">:</code></div>
<div class="line number7 index6 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">SomeType( )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : SomeType( 0, </code><code class="cpp string">"invalid"</code> <code class="cpp plain">){}</code></div>
<div class="line number8 index7 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">SomeType( </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : SomeType( i, </code><code class="cpp string">"guest"</code> <code class="cpp plain">){}</code></div>
<div class="line number9 index8 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">SomeType( string&amp;amp; s ) : SomeType( 1, s ){ PostInit(); }</code></div>
<div class="line number10 index9 alt1"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<p>但是，为了方便并不足让&#8220;委托构造&#8221;这个事出现，最主要的问题是，基类的构造不能直接成为派生类的构造，就算是基类的构造函数够了，派生类还要自己写自己的构造函数：</p>
<div>
<div id="highlighter_561509" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">class</code> <code class="cpp plain">BaseClass</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp keyword bold">public</code><code class="cpp plain">:</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">BaseClass(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">iValue);</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">};</code></div>
<div class="line number6 index5 alt1">&nbsp;</div>
<div class="line number7 index6 alt2"><code class="cpp keyword bold">class</code> <code class="cpp plain">DerivedClass : </code><code class="cpp keyword bold">public</code> <code class="cpp plain">BaseClass</code></div>
<div class="line number8 index7 alt1"><code class="cpp plain">{</code></div>
<div class="line number9 index8 alt2"><code class="cpp keyword bold">public</code><code class="cpp plain">:</code></div>
<div class="line number10 index9 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">using</code> <code class="cpp plain">BaseClass::BaseClass;</code></div>
<div class="line number11 index10 alt2"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<p>上例中，派生类手动继承基类的构造函数， 编译器可以使用基类的构造函数完成派生类的构造。 而将基类的构造函数带入派生类的动作 无法选择性地部分带入， 所以，要不就是继承基类全部的构造函数，要不就是一个都不继承(不手动带入)。 此外，若牵涉到多重继承，从多个基类继承而来的构造函数不可以有相同的函数签名(signature)。 而派生类的新加入的构造函数也不可以和继承而来的基类构造函数有相同的函数签名，因为这相当于重复声明。（所谓函数签名就是函数的参数类型和顺序不）</p>
<h4 class="color-programming"><a name="t8"></a>右值引用和move语义</h4>
<p>在老版的C++中，临时性变量（称为右值&#8221;R-values&#8221;，位于赋值操作符之右）经常用作交换两个变量。比如下面的示例中的tmp变量。示例中的那个函数需要传递两个string的引用，但是在交换的过程中产生了对象的构造，内存的分配还有对象的拷贝构造等等动作，成本比较高。</p>
<div>
<div id="highlighter_115614" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">naiveswap(string &amp;amp;a, string &amp;amp;b)</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;</code><code class="cpp plain">string temp = a;</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;</code><code class="cpp plain">a=b;</code></div>
<div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;</code><code class="cpp plain">b=temp;</code></div>
<div class="line number6 index5 alt1"><code class="cpp plain">}</code></div></div></td></tr></tbody></table></div></div>
<p>C++ 11增加一个新的引用（reference）类型称作右值引用（R-value reference），标记为<tt>typename &amp;&amp;</tt>。他们能够以non-const值的方式传入，允许对象去改动他们。这项修正允许特定对象创造出move语义。</p>
<p>举例而言，上面那个例子中，string类中保存了一个动态内存分存的char*指针，如果一个string对象发生拷贝构造（如：函数返回），string类里的char*内存只能通过创建一个新的临时对象，并把函数内的对象的内存copy到这个新的对象中，然后销毁临时对象及其内存。<strong>这是原来C++性能上重点被批评的事</strong>。</p>
<p>能过右值引用，string的构造函数需要改成&#8220;move构造函数&#8221;，如下所示。这样一来，使得对某个<span style="font-family: monospace">stirng</span>的右值引用可以单纯地从右值复制其内部C-style的指针到新的string，然后留下空的右值。这个操作不需要内存数组的复制，而且空的暂时对象的析构也不会释放内存。其更有效率。</p>
<div>
<div id="highlighter_780965" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp keyword bold">class</code> <code class="cpp plain">string</code></div>
<div class="line number2 index1 alt1"><code class="cpp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">string (string&amp;&amp;); </code><code class="cpp comments">//move constructor</code></div>
<div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">string&amp;&amp; operator=(string&amp;&amp;); </code><code class="cpp comments">//move assignment operator</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
<p>The C++11 STL中广泛地使用了右值引用和move语议。因此，很多算法和容器的性能都被优化了。</p>
<h4 class="color-programming"><a name="t9"></a>C++ 11 STL 标准库</h4>
<p>C++ STL库在2003年经历了很大的整容手术&nbsp;<a href="http://www.devsource.com/c/a/Languages/Grok-The-New-Features-in-Standard-C/">Library Technical Report 1</a> (TR1)。 TR1 中出现了很多新的容器类 (<code>unordered_set</code>, <code>unordered_map</code>, <code>unordered_multiset</code>, 和&nbsp;<code>unordered_multimap</code>) 以及一些新的库支持诸如：正则表达式， tuples，函数对象包装，等等。 C++11 批准了 TR1 成为正式的C++标准，还有一些TR1 后新加的一些库，从而成为了新的C++ 11 STL标准库。这个库主要包含下面的功能：</p>
<h5 class="color-programming"><a name="t10"></a>线程库</h5>
<p>这们就不多说了，以前的STL饱受线程安全的批评。现在好 了。C++ 11 支持线程类了。这将涉及两个部分：第一、设计一个可以使多个线程在一个进程中共存的内存模型；第二、为线程之间的交互提供支持。第二部分将由程序库提供支持。大家可以看看<a href="http://en.wikipedia.org/wiki/Futures_and_promises" target="_blank">promises and futures</a>，其用于对象的同步。&nbsp;<a href="http://www.stdthread.co.uk/doc/headers/future/async.html">async()</a>&nbsp;函数模板用于发起并发任务，而&nbsp;<a href="http://www.devx.com/cplus/10MinuteSolution/37436">thread_local</a>&nbsp;为线程内的数据指定存储类型。更多的东西，可以查看 Anthony Williams的&nbsp;<a href="http://www.devx.com/SpecialReports/Article/38883">Simpler Multithreading in C++0x</a>.</p>
<h5 class="color-programming"><a name="t11"></a>新型智能指针</h5>
<p>C++98 的知能指针是&nbsp;<code>auto_ptr， 在C++ 11中被废弃了。</code>C++11 &nbsp;引入了两个指针类：&nbsp;<a href="http://www.informit.com/guides/content.aspx?g=cplusplus&amp;seqNum=239">shared_ptr</a> 和 <a href="http://www.informit.com/guides/content.aspx?g=cplusplus&amp;seqNum=400">unique_ptr</a>。 shared_ptr只是单纯的引用计数指针，<code>unique_ptr 是用来取代<code>auto_ptr</code></code>。&nbsp;<code>unique_ptr</code>&nbsp;提供&nbsp;<code>auto_ptr</code>&nbsp;大部份特性，唯一的例外是&nbsp;<code>auto_ptr</code>&nbsp;的不安全、隐性的左值搬移。不像&nbsp;<code>auto_ptr</code>，<code>unique_ptr</code>&nbsp;可以存放在 C++0x 提出的那些能察觉搬移动作的容器之中。</p>
<p>为什么要这么干？大家可以看看《More Effective C++》中对 auto_ptr的讨论。</p>
<h5 class="color-programming"><a name="t12"></a>新的算法</h5>
<p>定义了一些新的算法：&nbsp;<code>all_of()</code>, <code>any_of()</code>&nbsp;和&nbsp;<code>none_of()。</code></p>
<div>
<div id="highlighter_454948" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp preprocessor">#include &amp;lt;algorithm&amp;gt;</code></div>
<div class="line number2 index1 alt1"><code class="cpp comments">//C++11 code</code></div>
<div class="line number3 index2 alt2"><code class="cpp comments">//are all of the elements positive?</code></div>
<div class="line number4 index3 alt1"><code class="cpp plain">all_of(first, first+n, ispositive()); </code><code class="cpp comments">//false</code></div>
<div class="line number5 index4 alt2"><code class="cpp comments">//is there at least one positive element?</code></div>
<div class="line number6 index5 alt1"><code class="cpp plain">any_of(first, first+n, ispositive());</code><code class="cpp comments">//true</code></div>
<div class="line number7 index6 alt2"><code class="cpp comments">// are none of the elements positive?</code></div>
<div class="line number8 index7 alt1"><code class="cpp plain">none_of(first, first+n, ispositive()); </code><code class="cpp comments">//false</code></div></div></td></tr></tbody></table></div></div>
<p>使用新的copy_n()算法，你可以很方便地拷贝数组。</p>
<div>
<div id="highlighter_647452" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp preprocessor">#include &amp;lt;algorithm&amp;gt;</code></div>
<div class="line number2 index1 alt1"><code class="cpp color1 bold">int</code> <code class="cpp plain">source[5]={0,12,34,50,80};</code></div>
<div class="line number3 index2 alt2"><code class="cpp color1 bold">int</code> <code class="cpp plain">target[5];</code></div>
<div class="line number4 index3 alt1"><code class="cpp comments">//copy 5 elements from source to target</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">copy_n(source,5,target);</code></div></div></td></tr></tbody></table></div></div>
<p>使用&nbsp;<code>iota()</code>&nbsp;可以用来创建递增的数列。如下例所示：</p>
<div>
<div id="highlighter_195189" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div></td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp plain">include &amp;lt;numeric&amp;gt;</code></div>
<div class="line number2 index1 alt1"><code class="cpp color1 bold">int</code> <code class="cpp plain">a[5]={0};</code></div>
<div class="line number3 index2 alt2"><code class="cpp color1 bold">char</code> <code class="cpp plain">c[3]={0};</code></div>
<div class="line number4 index3 alt1"><code class="cpp plain">iota(a, a+5, 10); </code><code class="cpp comments">//changes a to {10,11,12,13,14}</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">iota(c, c+3, </code><code class="cpp string">'a'</code><code class="cpp plain">); </code><code class="cpp comments">//{'a','b','c'}</code></div></div></td></tr></tbody></table></div></div>
<p>总之，看下来，C++11 还是很学院派，很多实用的东西还是没有，比如： XML，sockets，reflection，当然还有垃圾回收。看来要等到C++ 20了。呵呵。不过C++ 11在性能上还是很快。参看 Google&#8217;s <a href="http://www.itproportal.com/2011/06/07/googles-rates-c-most-complex-highest-performing-language/">benchmark tests</a>。原文还引用Stroustrup 的观点：C++11 是一门新的语言&#8212;&#8212;一个更好的 C++。</p>
<p>如果把所有的改变都列出来，你会发现真多啊。我估计C++ Primer那本书的厚度要增加至少30%以上。C++的门槛会不会越来越高了呢？我不知道，但我个人觉得这门语言的确是变得越来越令人望而却步了。（想起了某人和我说的一句话&#8212;&#8212;学技术真的是太累了，还是搞方法论好混些？）</p><img src ="http://www.cppblog.com/tianbianlan/aggbug/199992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tianbianlan/" target="_blank">天边蓝</a> 2013-05-05 21:26 <a href="http://www.cppblog.com/tianbianlan/archive/2013/05/05/199992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各编译器对于C++11新特性的支持情况</title><link>http://www.cppblog.com/tianbianlan/archive/2013/05/05/199991.html</link><dc:creator>天边蓝</dc:creator><author>天边蓝</author><pubDate>Sun, 05 May 2013 13:11:00 GMT</pubDate><guid>http://www.cppblog.com/tianbianlan/archive/2013/05/05/199991.html</guid><wfw:comment>http://www.cppblog.com/tianbianlan/comments/199991.html</wfw:comment><comments>http://www.cppblog.com/tianbianlan/archive/2013/05/05/199991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tianbianlan/comments/commentRss/199991.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tianbianlan/services/trackbacks/199991.html</trackback:ping><description><![CDATA[<p class="line874">http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport<br />The following table lists C++0x features and their support in popular compilers. <span id="line-2" class="anchor"></span>
<div>
<table style="text-align: center; width: 1201px; height: 2349px">
<tbody>
<tr>
<td style="text-align: center" colspan="12">
<p class="line862">Status Of C++ 0x Language Features in Compilers </p></td></tr>
<tr style="background-color: #b0e0e6; font-weight: bold">
<td><span id="line-3" class="anchor"></span>
<p class="line862">C++ 0x FEATURE </p></td>
<td style="width: 12%">
<p class="line862">PAPER(S) </p></td>
<td>
<p class="line862">HP aCC </p></td>
<td>
<p class="line862">EDG eccp </p></td>
<td>
<p class="line891"><a class="http" href="http://gcc.gnu.org/projects/cxx0x.html">GCC</a> </p></td>
<td>
<p class="line891"><a class="http" href="http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/">Intel C++</a> </p></td>
<td>
<p class="line891"><a class="http" href="http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx">MSVC</a> </p></td>
<td>
<p class="line891"><a class="https" href="https://www.ibm.com/developerworks/mydeveloperworks/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/xlc_compiler_s_c_11_support50?lang=en">IBM XLC++</a> </p></td>
<td>
<p class="line862">Sun/ Oracle C++ </p></td>
<td>
<p class="line891"><a class="http" href="http://docwiki.embarcadero.com/RADStudio/XE3/en/C++11_Features_(BCC64)">Embarcadero C++ Builder</a> </p></td>
<td>
<p class="line862">Digital Mars C++ </p></td>
<td>
<p class="line891"><a class="http" href="http://clang.llvm.org/cxx_status.html">Clang</a> </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-4" class="anchor"></span>
<p class="line891"><tt class="backtick">alignas</tt> </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf">N2341</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.8 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-5" class="anchor"></span>
<p class="line891"><tt class="backtick">alignof</tt> </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf">N2341</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.5 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-6" class="anchor"></span>
<p class="line862">Atomic operations </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html">N2427</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.4 </p></td>
<td>
<p class="line862">13.0 </p></td>
<td>
<p class="line862">11.0 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.1 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-7" class="anchor"></span>
<p class="line891"><tt class="backtick">auto</tt> </p></td>
<td>
<p class="line862">v0.9: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf">N1984</a>, v1.0: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm">N2546</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1(v0.9) </p></td>
<td>
<p class="line862">4.4(v1.0) </p></td>
<td>
<p class="line862">11.0(v0.9) </p></td>
<td>
<p class="line862">10.0(v0.9) </p></td>
<td>
<p class="line862">11.1 (V1.0) </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-8" class="anchor"></span>
<p class="line862">C99 preprocessor </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm">N1653</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.3 </p></td>
<td>
<p class="line862">11.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">10.1 </p></td>
<td>
<p class="line862">5.9 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td></tr>
<tr style="background-color: #d3d3d3">
<td style="text-align: left"><span id="line-9" class="anchor"></span>
<p class="line891"><em>Concepts <sup>[removed]</sup></em> </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2617.pdf">N2617</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line891"><a class="nonexistent" href="http://wiki.apache.org/stdcxx/ConceptGcc">ConceptGcc</a> </p></td>
<td>
<p class="line891"><br /></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td></tr>
<tr>
<td style="text-align: left"><span id="line-10" class="anchor"></span>
<p class="line891"><tt class="backtick">constexpr</tt> </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf">N2235</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.6 </p></td>
<td>
<p class="line862">13.0 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.1 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-11" class="anchor"></span>
<p class="line891"><tt class="backtick">decltype</tt> </p></td>
<td>
<p class="line862">v1.0: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf">N2343</a>, v1.1: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf">N3276</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1(v1.0) </p></td>
<td>
<p class="line862">4.3(v1.0) 4.8.1(v1.1) </p></td>
<td>
<p class="line862">11.0(v1.0) </p></td>
<td>
<p class="line862">10.0(v1.0), 11.0(v1.1) </p></td>
<td>
<p class="line862">11.1 (V1.0) </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-12" class="anchor"></span>
<p class="line862">Defaulted And Deleted Functions </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm">N2346</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1 </p></td>
<td>
<p class="line862">4.4 </p></td>
<td>
<p class="line862">12.0 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-13" class="anchor"></span>
<p class="line862">Delegating Constructors </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf">N1986</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.7 </p></td>
<td>
<p class="line891"><br /></p></td>
<td>
<p class="line862">11.0 nov'12 </p></td>
<td>
<p class="line862">11.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-14" class="anchor"></span>
<p class="line862">Explicit conversion operators </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf">N2437</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.5 </p></td>
<td>
<p class="line862">13.0 </p></td>
<td>
<p class="line862">11.0 nov'12 </p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-15" class="anchor"></span>
<p class="line862">Extended <tt class="backtick">friend</tt> Declarations </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf">N1791</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1 </p></td>
<td>
<p class="line862">4.7 </p></td>
<td>
<p class="line862">11.0 </p></td>
<td>
<p class="line862">10.0*** </p></td>
<td>
<p class="line891"><a class="nonexistent" href="http://wiki.apache.org/stdcxx/V1R11">V1R11</a>,11.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-16" class="anchor"></span>
<p class="line891"><tt class="backtick">extern&nbsp;template</tt> </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm">N1987</a> </p></td>
<td>
<p class="line862">3, 5, 6 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.3 </p></td>
<td>
<p class="line862">9 </p></td>
<td>
<p class="line862">6.0 </p></td>
<td>
<p class="line891"><a class="nonexistent" href="http://wiki.apache.org/stdcxx/V1R11">V1R11</a>,11.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-17" class="anchor"></span>
<p class="line862">Forward declarations for enums </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf">N2764</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.6 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">11.0 </p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.1 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-18" class="anchor"></span>
<p class="line862">Inheriting Constructors </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm">N2540</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.8 </p></td>
<td>
<p class="line891"><br /></p></td>
<td>
<p class="line891"><br /></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td></tr>
<tr>
<td style="text-align: left"><span id="line-19" class="anchor"></span>
<p class="line862">Initializer Lists </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm">N2672</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.4 </p></td>
<td>
<p class="line862">13.0 </p></td>
<td>
<p class="line862">11.0 nov'12 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.1 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-20" class="anchor"></span>
<p class="line862">Lambda expressions and closures </p></td>
<td>
<p class="line862">v0.9: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2550.pdf">N2550</a>, v1.0: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2658.pdf">N2658</a>, v1.1: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2927.pdf">N2927</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1(v0.9) </p></td>
<td>
<p class="line862">4.5(v1.1) </p></td>
<td>
<p class="line862">11.0(v0.9)<br />12.0(v1.0) </p></td>
<td>
<p class="line862">10.0(v1.0), 11.0(v1.1) </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.1 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-21" class="anchor"></span>
<p class="line862">Local and Unnamed Types as Template Arguments </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm">N2657</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.5 </p></td>
<td>
<p class="line862">12.0 </p></td>
<td>
<p class="line862">10.0 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-22" class="anchor"></span>
<p class="line891"><tt class="backtick">long&nbsp;long</tt> </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf">N1811</a> </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862">Yes </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-23" class="anchor"></span>
<p class="line862">Namespace Association </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm">N2535</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.4 </p></td>
<td>
<p class="line891"><br /></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">11.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-24" class="anchor"></span>
<p class="line862">New character types </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html">N2249</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.4 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-25" class="anchor"></span>
<p class="line862">New function declaration syntax for deduced return types </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm">N2541</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1 </p></td>
<td>
<p class="line862">4.4 </p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862">10.0 </p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-26" class="anchor"></span>
<p class="line891"><tt class="backtick">nullptr</tt> </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf">N2431</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.6 </p></td>
<td>
<p class="line862">12.1* </p></td>
<td>
<p class="line862">10.0 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-27" class="anchor"></span>
<p class="line862">Unicode String Literals </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm">N2442</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.4 </p></td>
<td>
<p class="line862">11.0* </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">5.7 </p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-28" class="anchor"></span>
<p class="line862">Raw String Literals </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm">N2442</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.5 </p></td>
<td>
<p class="line891"><br /></p></td>
<td>
<p class="line862">11.0 nov'12 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-29" class="anchor"></span>
<p class="line862">User-defined Literals </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.html">N2765</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.7 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.1 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-30" class="anchor"></span>
<p class="line862">Right Angle Brackets </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html">N1757</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1 </p></td>
<td>
<p class="line862">4.3 </p></td>
<td>
<p class="line862">11.0 </p></td>
<td>
<p class="line862">8.0 </p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-31" class="anchor"></span>
<p class="line862">R-Value References, std::move </p></td>
<td>
<p class="line862">v1.0: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html">N2118</a>, v2.0: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2844.html">N2844</a>, v2.1: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1138">N2844+</a>, v3.0: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html">N3053</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1(v1.0) </p></td>
<td>
<p class="line862">4.3(v1.0)<br />4.5(v2.1)<br />4.6(v3.0) </p></td>
<td>
<p class="line862">11.1(v1.0)<br />12.0(v2.0) </p></td>
<td>
<p class="line862">10.0(v2.0), 11.0(v2.1) </p></td>
<td>
<p class="line862">12.1(v2.1) </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-32" class="anchor"></span>
<p class="line891"><tt class="backtick">static_assert</tt> </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html">N1720</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1 </p></td>
<td>
<p class="line862">4.3 </p></td>
<td>
<p class="line862">11.0 </p></td>
<td>
<p class="line862">10.0 </p></td>
<td>
<p class="line862">11.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-33" class="anchor"></span>
<p class="line862">Strongly-typed <tt class="backtick">enum</tt>s </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf">N2347</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.4 </p></td>
<td>
<p class="line862">12.0 </p></td>
<td>
<p class="line862">11.0 </p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-34" class="anchor"></span>
<p class="line862">Template aliases </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf">N2258</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.7 </p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-35" class="anchor"></span>
<p class="line862">Thread-Local Storage </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm">N2659</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.8 (4.4****) </p></td>
<td>
<p class="line862">11.1***<br /></p></td>
<td>
<p class="line862">10.0*** </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">5.9*** </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9**** </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-36" class="anchor"></span>
<p class="line862">Unrestricted Unions </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf">N2544</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.6 </p></td>
<td>
<p class="line891"><br /></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-37" class="anchor"></span>
<p class="line862">Built-in Type Traits </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf">N1836</a> </p></td>
<td>
<p class="line862">6.16 </p></td>
<td>
<p class="line862">4.0 </p></td>
<td>
<p class="line862">4.3 </p></td>
<td>
<p class="line862">10.0 </p></td>
<td>
<p class="line862">8.0 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">Yes </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-38" class="anchor"></span>
<p class="line862">Variadic Templates </p></td>
<td>
<p class="line862">v0.9: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf">N2242</a>, v1.0: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf">N2555</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.1(v0.9) </p></td>
<td>
<p class="line862">4.3(v0.9) 4.4(v1.0) </p></td>
<td>
<p class="line862">12.1(v0.9) </p></td>
<td>
<p class="line862">11.0 nov'12 </p></td>
<td>
<p class="line862">11.1 (v0.9) </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9(1.0) </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-39" class="anchor"></span>
<p class="line862">Range-based for-loop </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html">N2930</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.6 </p></td>
<td>
<p class="line862">13.0 </p></td>
<td>
<p class="line862">11.0 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-40" class="anchor"></span>
<p class="line862">override and final </p></td>
<td>
<p class="line862">v0.8: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2928.htm">N2928</a>, v0.9: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm">N3206</a>, v1.0: <a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm">N3272</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.7 </p></td>
<td>
<p class="line862">12.0(v0.8)*** </p></td>
<td>
<p class="line862">8.0(v0.8)*** 11.0(v1.0) </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-41" class="anchor"></span>
<p class="line862">Attributes </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf">N2761</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.8 </p></td>
<td>
<p class="line862">12.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td></tr>
<tr>
<td style="text-align: left"><span id="line-42" class="anchor"></span>
<p class="line862">ref-qualifiers </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm">N2439</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.8.1 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-43" class="anchor"></span>
<p class="line862">Non-static data member initializers </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2756.htm">N2756</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.7 </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">3.0 </p></td></tr>
<tr>
<td style="text-align: left"><span id="line-44" class="anchor"></span>
<p class="line862">Dynamic initialization and destruction with concurrency (Magic statics) </p></td>
<td>
<p class="line891"><a class="http" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm">N2660</a> </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">4.3 </p></td>
<td>
<p class="line862">? </p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862"></p></td>
<td>
<p class="line862">2.9 </p></td></tr></tbody></table></div><span id="line-45" class="anchor"></span><span id="line-46" class="anchor"></span><span id="line-47" class="anchor"></span><span id="line-48" class="anchor"></span><span id="line-49" class="anchor"></span>
<p class="line862">* &#8212; 1) unicode string literals is a feature of the EDG frontend, but it is undocumented at Intel C++ compiler (/Qoption,cpp,"--uliterals" option enables it) <br /></p> <img src ="http://www.cppblog.com/tianbianlan/aggbug/199991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tianbianlan/" target="_blank">天边蓝</a> 2013-05-05 21:11 <a href="http://www.cppblog.com/tianbianlan/archive/2013/05/05/199991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>