<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wut I am &#187; vs/vc++</title>
	<atom:link href="http://wutiam.net/tag/vs-vc/feed/" rel="self" type="application/rss+xml" />
	<link>http://wutiam.net</link>
	<description>I'm islet8, I'm what I am</description>
	<lastBuildDate>Wed, 28 Jul 2010 02:50:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</title>
		<link>http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/</link>
		<comments>http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 09:59:39 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[vs/vc++]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=132</guid>
		<description><![CDATA[转载自痴痴笑笑的博客，略有删改。
尽管 C++ 社区对 C++ 0x 很是追捧，但是各厂商对于新标准的支持并不热乎。盼星星盼月亮，微软作为 Windows 平台上最强势的 C++ 编译器厂商也终于在 Visual Studio 2010 中开始支持 C++ 0x 的特性。
Visual Studio 2010 中的 Visual C++ 编译器，即 VC10, 包含了 4 个 C++ 0x 的语言特性：lambda 表达式，自动类型推演（auto 关键字），静态断言（static_assert）和右值引用（rvalue reference）。

Lambda 表达式
使用过函数式编程语言（如 LISP、 F#）或一些动态语言（如 Python、Javascript）的大侠对于 lambda 表达式一定不会陌生。在 C++ 0x 中，引入了 lambda 表达式来定义无名仿函数。下面是一个 lambda 表达式的简单例子：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include &#60;algorithm&#62;
#include &#60;iostream&#62;
#include &#60;ostream&#62;
#include &#60;vector&#62;
&#160;
using namespace std;
&#160;
int main&#40;&#41; &#123;
  [...]


Related posts:<ul><li><a href='http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/' rel='bookmark' title='Permanent Link: Visual Studio 2008 无法进入修复/卸载界面的解决办法'>Visual Studio 2008 无法进入修复/卸载界面的解决办法</a></li>
<li><a href='http://wutiam.net/2009/05/ctreectrl-traversal/' rel='bookmark' title='Permanent Link: 遍历 CTreeCtrl'>遍历 CTreeCtrl</a></li>
<li><a href='http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/' rel='bookmark' title='Permanent Link: IE8 引发 VS 2005/2008 向导出错的解决方案'>IE8 引发 VS 2005/2008 向导出错的解决方案</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>转载自<a href="http://www.cnblogs.com/brucejia/" target="_blank">痴痴笑笑的博客</a>，略有删改。</p>
<p>尽管 C++ 社区对 C++ 0x 很是追捧，但是各厂商对于新标准的支持并不热乎。盼星星盼月亮，微软作为 Windows 平台上最强势的 C++ 编译器厂商也终于在 Visual Studio 2010 中开始支持 C++ 0x 的特性。</p>
<p>Visual Studio 2010 中的 Visual C++ 编译器，即 VC10, 包含了 4 个 C++ 0x 的语言特性：lambda 表达式，自动类型推演（auto 关键字），静态断言（static_assert）和右值引用（rvalue reference）。<br />
<span id="more-132"></span></p>
<h3>Lambda 表达式</h3>
<p>使用过函数式编程语言（如 LISP、 F#）或一些动态语言（如 Python、Javascript）的大侠对于 lambda 表达式一定不会陌生。在 C++ 0x 中，引入了 lambda 表达式来定义无名仿函数。下面是一个 lambda 表达式的简单例子：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;ostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">0 1 2 3 4 5 6 7 8 9</pre></div></div>

<p>for_each 一行中，中括号 [] 称为 lambda introducer，它告诉编译器接下来的是一个 lambda 表达式；接下来 (int n) 是 lambda 表达式的参数声明；最后大括号里边就是“函数体”了。</p>
<p>注意这里因为 lambda 表达式生成的是 functor，所以“函数体”实际上是指这个 functor 的 operator() 的调用部分。你也许会问：那么返回值呢？缺省情况下 lambda 表达式生成的 functor 调用返回类型为 void。</p>
<p>为了方便，以下会用“lambda 返回 void”的简短表述来代替冗长啰嗦的表述—— lambda 表达式生成一个 functor 类型，这个 functor 类型的函数调用操作符（operator()），返回的类型是 void。<br />
请大家一定记住：lambda 表达式生成了类型，并构造该类型的实例。</p>
<p>下面的例子中 lambda 表达式的“函数体”包含多条语句：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;ostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n<span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000040;">%</span> <span style="color: #0000dd;">2</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; even &quot;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; odd &quot;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>上文提到了 lambda 表达式缺省情况下返回 void，那么如果需要返回其他类型呢？答案是：lambda 表达式的“函数体”中如果有一个 return 的表达式，例如 { return expression; }，那么编译器将自动推演 expression 的类型作为返回类型。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;deque&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;iterator&gt;</span>
<span style="color: #339900;">#include &lt;ostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    deque<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> d<span style="color: #008080;">;</span>
&nbsp;
    transform<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, front_inserter<span style="color: #008000;">&#40;</span>d<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> n <span style="color: #000040;">*</span> n <span style="color: #000040;">*</span> n<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>d.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, d.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>上例中返回值 n * n * n 很简单，类型推演是显而易见的。但是如果 lambda 表达式中有非常复杂的表达式时，编译器可能无法推演出其类型，或者是推演出现二义性，这时候你可以显式地指明返回值类型。如下所示：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">transform<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, front_inserter<span style="color: #008000;">&#40;</span>d<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">double</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000040;">%</span> <span style="color: #0000dd;">2</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> n <span style="color: #000040;">*</span> n <span style="color: #000040;">*</span> n<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> n <span style="color: #000040;">/</span> <span style="color:#800080;">2.0</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>“-> double”显式地指明了 lambda 表达式的返回类型是 double。</p>
<p>以上例子中的 lambda 都是无状态的，不包含任何数据成员。很多时候我们需要 lambda 包含数据成员以保存状态，这一点可以通过“捕获”局部变量来实现。</p>
<p>Lambda 表达式的导入符（lambda introducer）是空的，也就是“[]”，表明该 lambda 是一个无状态的。但是在 lambda导入符中可以指定一个“捕获列表”，下面的代码中的 lambda 使用了局部变量 x 和 y，将值介于 x 和 y 之间的元素从集合中删除：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> y <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Input: &quot;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> x <span style="color: #000080;">&gt;&gt;</span> y<span style="color: #008080;">;</span>
    v.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>remove_if<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>x, y<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> x <span style="color: #000080;">&lt;</span> n <span style="color: #000040;">&amp;&amp;</span> n <span style="color: #000080;">&lt;</span> y<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">Input: 4 7
0 1 2 3 4 7 8 9</pre></div></div>

<p>上面代码中很重要的一点信息是：lambda 中捕获的局部变量是以“传值”的方式传给匿名函数对象的。在匿名函数对象中，保存有“捕获列表”中局部变量的拷贝。这一点使得匿名函数对象的生命周期能够长于 main 中的 x、y 局部变量。然而这样的传值方式带来几个限制：</p>
<ol>
<li>lambda中的这两个拷贝并不能被改变，因为缺省情况下函数对象的 operator() 是const</li>
<li>有的对象的拷贝操作开销很大或者不可能（例如如果上面代码中的 x、y 是数据库链接或者某个 singleton）</li>
<li>即使在lambda内部修改了 m_a、m_b 也不能够影响外边main函数中的 x 和 y</li>
</ol>
<p>既然有了“传值”，你一定猜到了还会有“传引用”。Bingo! 你是对的。</p>
<p>在讨论“传引用”之前，我们先来看看另一个比较有用的东西。假设你有一大堆的局部变量需要被 lambda 使用，那么你的“捕获列表”将会写的很长，这肯定不是件愉快的事情。</p>
<p>好在 C++ 委员会的老头们也想到了，C++ 0x 中提供了一个省心的东西：如果捕获列表写成 [=]，表示 lambda 将捕获所有的局部变量，当然也是传值方式。这种方式姑且被称为“缺省捕获”：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> y <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Input: &quot;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> x <span style="color: #000080;">&gt;&gt;</span> y<span style="color: #008080;">;</span> <span style="color: #666666;">// EVIL!</span>
    v.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>remove_if<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> x <span style="color: #000080;">&lt;</span> n <span style="color: #000040;">&amp;&amp;</span> n <span style="color: #000080;">&lt;</span> y<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>当编译器在 lambda 的作用范围内看到局部变量 x、y 时，它会以传值的方式从 main 函数中将它们捕获。</p>
<p>下面我们来看如何突破前面提到的 3 点限制。</p>
<p>第 1 点，修改 lambda 表达式中的局部变量拷贝（e.g. m_a, m_b）。缺省情况下，lambda 的 operator() 是 const 修饰的，但是你可以使用 mutable 关键字改变这一点：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> y <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> r<span style="color: #008000;">&#41;</span> mutable <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> old <span style="color: #000080;">=</span> r<span style="color: #008080;">;</span>
        r <span style="color: #000040;">*</span><span style="color: #000080;">=</span> x <span style="color: #000040;">*</span> y<span style="color: #008080;">;</span>
        x <span style="color: #000080;">=</span> y<span style="color: #008080;">;</span>
        y <span style="color: #000080;">=</span> old<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;, &quot;</span> <span style="color: #000080;">&lt;&lt;</span> y <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">0 0 0 6 24 60 120 210 336 504
1, 1</pre></div></div>

<p>这里我们解决了第 1 个限制，但是却产生了一个新的限制：</p>
<ol start=4>
<li>lambda 中对捕获变量的修改并不会影响到 main 函数中的局部变量，因为 lambda 捕获局部变量使用的是传值方式</li>
</ol>
<p>下面该“传引用”的方式登场了，它能够有效地解决2，3，4三个限制。传引用的语法为： lambda-introducer [&amp;x, &amp;y]，这里的捕获列表应该理解为：X&amp; x, Y&amp; y，因为我们实际上是取的 x、y 的引用而不是地址。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> y <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #000040;">&amp;</span>x, <span style="color: #000040;">&amp;</span>y<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> r<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> old <span style="color: #000080;">=</span> r<span style="color: #008080;">;</span>
        r <span style="color: #000040;">*</span><span style="color: #000080;">=</span> x <span style="color: #000040;">*</span> y<span style="color: #008080;">;</span>
        x <span style="color: #000080;">=</span> y<span style="color: #008080;">;</span>
        y <span style="color: #000080;">=</span> old<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;, &quot;</span> <span style="color: #000080;">&lt;&lt;</span> y <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">0 0 0 6 24 60 120 210 336 504
8, 9</pre></div></div>

<p>注意：当你使用 lambda 时，VC10 编译器会为 lambda 的定义部分自动禁用 C4512 警告。</p>
<p>当以传引用方式捕获局部变量时，lambda 的函数对象在自己内部以引用方式保存 main 函数中的局部变量。当然因为使用的是局部对象的引用，使用lambda表达式时一定要注意不能够超出局部变量的生命周期。</p>
<p>和上文提高的[=]类似，我们可以用[&#038;]来以“传引用”的方式捕获所有的局部变量。</p>
<p>到目前为止，局部变量的捕获方式要么是“值语义”要么是“引用语义”，那么可以混合这两种方式吗？可以！例如：[a, b, c, &amp;d, e, &amp;f, g]，其中变量 d 和 f 是按引用语义捕获，而 a、b、c、e 和 g 是按值语义捕获。</p>
<p>另外很有用的一点是：你可以指定一个缺省捕获，然后重载某些局部变量的捕获方式。下边例子中[=, &amp;sum, &amp;product] 告诉编译器用值语义方式捕获所有的局部变量，但是有两个例外 - sum和product是按引用语义来捕获。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> sum <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> product <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> y <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #000080;">=</span>, <span style="color: #000040;">&amp;</span>sum, <span style="color: #000040;">&amp;</span>product<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> r<span style="color: #008000;">&#41;</span> mutable <span style="color: #008000;">&#123;</span>
        sum <span style="color: #000040;">+</span><span style="color: #000080;">=</span> r<span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>r <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            product <span style="color: #000040;">*</span><span style="color: #000080;">=</span> r<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> old <span style="color: #000080;">=</span> r<span style="color: #008080;">;</span>
        r <span style="color: #000040;">*</span><span style="color: #000080;">=</span> x <span style="color: #000040;">*</span> y<span style="color: #008080;">;</span>
        x <span style="color: #000080;">=</span> y<span style="color: #008080;">;</span>
        y <span style="color: #000080;">=</span> old<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sum: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> sum <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;, product: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> product <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;x: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;, y: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> y <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">0 0 0 6 24 60 120 210 336 504
sum: 45, product: 362880
x: 1, y: 1</pre></div></div>

<p>再来看看下边的代码，在lambda中使用类成员变量：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Kitty <span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">explicit</span> Kitty<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> toys<span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> m_toys<span style="color: #008000;">&#40;</span>toys<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">void</span> meow<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> v<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #008000;">&#123;</span>
        for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>m_toys<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;If you gave me &quot;</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; toys, I would have &quot;</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000040;">+</span> m_toys <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; toys total.&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">int</span> m_toys<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    Kitty k<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    k.<span style="color: #007788;">meow</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>不幸的是，编译这段代码将产生这样的错误：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">error C3480: 'Kitty::m_toys': a lambda capture variable must be from an enclosing function scope</pre></div></div>

<p>为什么呢？lambda表达式能够让你不活局部变量，但是类的数据成员并不是局部变量。解决方案呢？别着急。lambda 为捕获类的数据成员大开方便之门，你可以捕获this指针。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Kitty <span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">explicit</span> Kitty<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> toys<span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> m_toys<span style="color: #008000;">&#40;</span>toys<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">void</span> meow<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> v<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #008000;">&#123;</span>
        for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #0000dd;">this</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;If you gave me &quot;</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; toys, I would have &quot;</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000040;">+</span> m_toys <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; toys total.&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">int</span> m_toys<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    Kitty k<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    k.<span style="color: #007788;">meow</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">If you gave me 0 toys, I would have 5 toys total.
If you gave me 1 toys, I would have 6 toys total.
If you gave me 2 toys, I would have 7 toys total.</pre></div></div>

<p>当 lambda 表达式捕获“this”时，编译器看到 m_toys 后会在 this 所指向对象的范围内进行名字查找，m_toys 被隐式地推演为 this-&gt;m_toys。当然你也可以让编译器省省力气，显式地在捕获列表中使用 this-&gt;m_toys。另外，lambda 比较智能，你也可以隐式地捕获 this 指针，如下所示：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Kitty <span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">explicit</span> Kitty<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> toys<span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> m_toys<span style="color: #008000;">&#40;</span>toys<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">void</span> meow<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> v<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #008000;">&#123;</span>
        for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;If you gave me &quot;</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; toys, I would have &quot;</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000040;">+</span> m_toys <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; toys total.&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">int</span> m_toys<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    Kitty k<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    k.<span style="color: #007788;">meow</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">If you gave me 0 toys, I would have 5 toys total.
If you gave me 1 toys, I would have 6 toys total.
If you gave me 2 toys, I would have 7 toys total.</pre></div></div>

<p>注意你也可以在上面代码中用 [&amp;]，但是结果是一样的——this 指针永远是按值语义被传递(捕获)的。你也不能够使用 [&amp;this]，呵呵。</p>
<p>如果你的 lambda 表达式是没有参数的，那么 lambda 表达式的导入符后边的括号()也可以省掉。例如：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    generate_n<span style="color: #008000;">&#40;</span>back_inserter<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span>, <span style="color: #0000dd;">10</span>, <span style="color: #008000;">&#91;</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> i<span style="color: #000040;">++</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;i: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> i <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>上边是 [&amp;]() { return i++; }的简写形式，个人认为省掉括号并不是什么好的 coding style。如果你需要用到mutable或者指定lambda的返回类型，空的括号就不能够省略了。</p>
<p>最后，既然 lambda 表达式生成是普通的函数对象，所以函数对象支持的用法 lambda 都支持。例如和 tr1 的 function 一起使用，看看下边的代码，是不是很酷？</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">::</span><span style="color: #007788;">tr1</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> meow<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> v, <span style="color: #0000ff;">const</span> function<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">void</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> f<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    for_each<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, f<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        v.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    meow<span style="color: #008000;">&#40;</span>v, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    meow<span style="color: #008000;">&#40;</span>v, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000040;">*</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    function<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">void</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span> g <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> n <span style="color: #000040;">*</span> n <span style="color: #000040;">*</span> n <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
    meow<span style="color: #008000;">&#40;</span>v, g<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">0 1 2 3 4 5 6 7 8 9
0 1 4 9 16 25 36 49 64 81
0 1 8 27 64 125 216 343 512 729</pre></div></div>

<h3>auto 关键字</h3>
<p>auto 这个关键字来自 C++ 98 标准。在 C++ 98 中它没有什么作用，C++ 0x 中“借用”它来作为自动类型推演(automatic type deduction)。当 auto 出现在声明中时，它表示“请用初始化我的表达式类型作为我的类型”，例如下面代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;map&gt;</span>
<span style="color: #339900;">#include &lt;ostream&gt;</span>
<span style="color: #339900;">#include &lt;regex&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">::</span><span style="color: #007788;">tr1</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    map<span style="color: #000080;">&lt;</span>string, string<span style="color: #000080;">&gt;</span> m<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">const</span> regex r<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;(\\w+) (\\w+)&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>string s<span style="color: #008080;">;</span> getline<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span>, s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        smatch results<span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>regex_match<span style="color: #008000;">&#40;</span>s, results, r<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            m<span style="color: #008000;">&#91;</span>results<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> results<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">auto</span> i <span style="color: #000080;">=</span> m.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> i <span style="color: #000040;">!</span><span style="color: #000080;">=</span> m.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> i<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>second <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; are &quot;</span> <span style="color: #000080;">&lt;&lt;</span> i<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>first <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">cute kittens
ugly puppies
evil goblins
^Z
kittens are cute
goblins are evil
puppies are ugly</pre></div></div>

<p>上面例子中i的类型在编译时推演为 map<string, string>::iterator, 有了 auto 关键字你再也不用写又长又烦的代码了。（注意 m.begin() 返回类型是 iterator, 而不是 const_iterator, 因为这里的 m 并不是 const。C++0x 中的 cbegin() 能够解决这个问题，它返回 non-const 容器的 const 迭代器。）</p>
<p><strong>Lambda 表达式和 auto 关键字的配合</strong></p>
<p>上文中提到了用 tr1::functions 来存储 lambda 表达式，但是不建议那样做除非不得已，因为 tr1::functions 的开销问题。如果你需要复用 lambda 表达式或者像给它命名，那么 auto 是更好的选择。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;ostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> T, <span style="color: #0000ff;">typename</span> Predicate<span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">void</span> keep_if<span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> v, Predicate pred<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">auto</span> notpred <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> t<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">!</span>pred<span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    v.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>remove_if<span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, notpred<span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> Container<span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">void</span> print<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Container<span style="color: #000040;">&amp;</span> c<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    for_each<span style="color: #008000;">&#40;</span>c.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, c.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">typename</span> Container<span style="color: #008080;">::</span><span style="color: #007788;">value_type</span><span style="color: #000040;">&amp;</span> e<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> e <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> a<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">100</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        a.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> b<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">100</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">200</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        b.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">auto</span> prime <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">bool</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> n <span style="color: #000040;">/</span> i<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000040;">%</span> i <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    keep_if<span style="color: #008000;">&#40;</span>a, prime<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    keep_if<span style="color: #008000;">&#40;</span>b, prime<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    print<span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    print<span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199</pre></div></div>

<p>上面代码中 notpred 是一个 lambda 表达式的否定式。这个例子中我们不能够使用 C++ 98 的 not1()，因为 not1 要求你的谓词是从 unary_function 派生的，但是 lambda 并不要求这点，所以很多情况下使用 lambda 更灵活。</p>
<h3>静态断言 static_assert</h3>
<p>断言（assertion）是提高代码质量的有效武器。C++标准库中的 assert、MFC 中的 ASSERT /VERIFY 宏都是断言的例子，它们的共同点是在运行时对程序状态进行判断，例如检查函数的参数有效性、检查类的不变式等。而 C++ 0x 中的静态断言呢，和运行时的断言不一样，它是编译时执行检查的。看下面的例子：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span> N<span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">struct</span> Kitten <span style="color: #008000;">&#123;</span>
static_assert<span style="color: #008000;">&#40;</span>N <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">2</span>, <span style="color: #FF0000;">&quot;Kitten&lt;N&gt; requires N &lt; 2.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    Kitten<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&gt;</span> peppermint<span style="color: #008080;">;</span>
    Kitten<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">3</span><span style="color: #000080;">&gt;</span> jazz<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>编译结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">staticfluffykitten.cpp(2) : error C2338: Kitten&lt;N&gt; requires N &lt; 2.
        staticfluffykitten.cpp(8) : see reference to class template instantiation 'Kitten&lt;N&gt;' being compiled
        with
        [
            N=3
        ]</pre></div></div>

<p>上面例子中用 static_assert 对模板参数 N 进行了检查，如果断言失败编译器将使用用户自定义的错误消息。</p>


<p>Related posts:<ul><li><a href='http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/' rel='bookmark' title='Permanent Link: Visual Studio 2008 无法进入修复/卸载界面的解决办法'>Visual Studio 2008 无法进入修复/卸载界面的解决办法</a></li>
<li><a href='http://wutiam.net/2009/05/ctreectrl-traversal/' rel='bookmark' title='Permanent Link: 遍历 CTreeCtrl'>遍历 CTreeCtrl</a></li>
<li><a href='http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/' rel='bookmark' title='Permanent Link: IE8 引发 VS 2005/2008 向导出错的解决方案'>IE8 引发 VS 2005/2008 向导出错的解决方案</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>让 Visual Studio 2005 自动生成 Manifest</title>
		<link>http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/</link>
		<comments>http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 15:34:30 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[vs/vc++]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=75</guid>
		<description><![CDATA[微软同学永远是个把简单问题复杂化的孩子，这不，当年为了在 Windows XP 中同时支持两套控件风格（新的 XP 风格和旧的 95/98 风格），“发明”了 .manifest 这么个玩意，使以前的老程序也能自动使用上新的控件风格。
然而在 VS 里，微软并不是总是默认帮我们自动生成这个破玩意儿。最早的办法就是手写一个 .manifest XML 文件，不过这个办法在 VS 2005 编译出来的程序里似乎并不起作用。当然，新方法总是随之而出的，而且很“简单”（绕了一大圈又回来了）：
在 Project Properties 对话框的 Configuration Properties &#124; Linker &#124; Manifest File &#124; Additional Manifest Dependencies 选项里，填入：

&#34;type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'&#34;

或者在程序里直接写下如下代码：

#pragma comment(linker, &#34;\&#34;/manifestdependency:type='Win32' name='Test.Research.SampleAssembly' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='0000000000000000' language='*'\&#34;&#34;)

太阳又照常东升西落了  


Related posts:征服 Visual Studio 的 Editor
Visual Studio 2008 无法进入修复/卸载界面的解决办法
IE8 [...]


Related posts:<ul><li><a href='http://wutiam.net/2009/05/tips-of-visual-studio-editor/' rel='bookmark' title='Permanent Link: 征服 Visual Studio 的 Editor'>征服 Visual Studio 的 Editor</a></li>
<li><a href='http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/' rel='bookmark' title='Permanent Link: Visual Studio 2008 无法进入修复/卸载界面的解决办法'>Visual Studio 2008 无法进入修复/卸载界面的解决办法</a></li>
<li><a href='http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/' rel='bookmark' title='Permanent Link: IE8 引发 VS 2005/2008 向导出错的解决方案'>IE8 引发 VS 2005/2008 向导出错的解决方案</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>微软同学永远是个把简单问题复杂化的孩子，这不，当年为了在 Windows XP 中同时支持两套控件风格（新的 XP 风格和旧的 95/98 风格），“发明”了 .manifest 这么个玩意，使以前的老程序也能自动使用上新的控件风格。</p>
<p>然而在 VS 里，微软并不是总是默认帮我们自动生成这个破玩意儿。最早的办法就是手写一个 .manifest XML 文件，不过这个办法在 VS 2005 编译出来的程序里似乎并不起作用。当然，新方法总是随之而出的，而且很“简单”（绕了一大圈又回来了）：</p>
<p>在 Project Properties 对话框的 Configuration Properties | Linker | Manifest File | Additional Manifest Dependencies 选项里，填入：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">&quot;type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'&quot;</pre></div></div>

<p>或者在程序里直接写下如下代码：</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#pragma comment(linker, &quot;\&quot;/manifestdependency:type='Win32' name='Test.Research.SampleAssembly' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='0000000000000000' language='*'\&quot;&quot;)</span></pre></div></div>

<p>太阳又照常东升西落了 <img src='http://wutiam.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>


<p>Related posts:<ul><li><a href='http://wutiam.net/2009/05/tips-of-visual-studio-editor/' rel='bookmark' title='Permanent Link: 征服 Visual Studio 的 Editor'>征服 Visual Studio 的 Editor</a></li>
<li><a href='http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/' rel='bookmark' title='Permanent Link: Visual Studio 2008 无法进入修复/卸载界面的解决办法'>Visual Studio 2008 无法进入修复/卸载界面的解决办法</a></li>
<li><a href='http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/' rel='bookmark' title='Permanent Link: IE8 引发 VS 2005/2008 向导出错的解决方案'>IE8 引发 VS 2005/2008 向导出错的解决方案</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2008 无法进入修复/卸载界面的解决办法</title>
		<link>http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/</link>
		<comments>http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 14:41:05 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[vs/vc++]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=103</guid>
		<description><![CDATA[最近需要在家办公，硬盘空间又不够了，只好卸了 VS2008 重装 VS2005，结果无论通过控制面板的卸载还是通过光盘的 autorun.exe，都在检查配置的时候弹出“A problem has been encountered while loading the setup  components. Canceling setup.”的错误对话框，然后就自动退出了，连修复的机会都完全不给……
放狗在 MSDN 的论坛里搜到了这篇帖子里 George175 给出的解决办法，原来是 VS2008 的一个 patch 捣的乱，直接进控制面板，进入添加/删除程序（或卸载程序），左边选择查看/卸载更新，找到“Hot Fix for Visual Studio 2008”这个玩意儿，直接咔嚓掉。
然后，VS2008 就能正常卸载了。
另，微软的一位同学说安装 VS2008 SP1 也能解决，没有验证，应该不会有错。


Related posts:IE8 引发 VS 2005/2008 向导出错的解决方案
征服 Visual Studio 的 Editor
让 Visual Studio 2005 自动生成 Manifest



Related posts:<ul><li><a href='http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/' rel='bookmark' title='Permanent Link: IE8 引发 VS 2005/2008 向导出错的解决方案'>IE8 引发 VS 2005/2008 向导出错的解决方案</a></li>
<li><a href='http://wutiam.net/2009/05/tips-of-visual-studio-editor/' rel='bookmark' title='Permanent Link: 征服 Visual Studio 的 Editor'>征服 Visual Studio 的 Editor</a></li>
<li><a href='http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/' rel='bookmark' title='Permanent Link: 让 Visual Studio 2005 自动生成 Manifest'>让 Visual Studio 2005 自动生成 Manifest</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>最近需要在家办公，硬盘空间又不够了，只好卸了 VS2008 重装 VS2005，结果无论通过控制面板的卸载还是通过光盘的 autorun.exe，都在检查配置的时候弹出“<span>A problem has been encountered while loading the setup  components. Canceling setup.</span>”的错误对话框，然后就自动退出了，连修复的机会都完全不给……</p>
<p>放狗在 MSDN 的论坛里搜到了<a title="A problem has been encountered while loading the setup components. Canceling setup." href="http://social.msdn.microsoft.com/Forums/en-US/Vsexpressinstall/thread/588c15f1-8a4d-48f6-87db-faeee1219bb2">这篇</a>帖子里 George175 给出的解决办法，原来是 VS2008 的一个 patch 捣的乱，直接进控制面板，进入添加/删除程序（或卸载程序），左边选择查看/卸载更新，找到“Hot Fix for Visual Studio 2008”这个玩意儿，直接咔嚓掉。</p>
<p>然后，VS2008 就能正常卸载了。</p>
<p>另，微软的一位<a title="Adding features to Visual Studio 2008 may fail to load setup components" href="http://blogs.msdn.com/heaths/archive/2008/10/06/adding-features-to-visual-studio-2008-may-fail-to-load-setup-components.aspx">同学</a>说安装 VS2008 SP1 也能解决，没有验证，应该不会有错。</p>


<p>Related posts:<ul><li><a href='http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/' rel='bookmark' title='Permanent Link: IE8 引发 VS 2005/2008 向导出错的解决方案'>IE8 引发 VS 2005/2008 向导出错的解决方案</a></li>
<li><a href='http://wutiam.net/2009/05/tips-of-visual-studio-editor/' rel='bookmark' title='Permanent Link: 征服 Visual Studio 的 Editor'>征服 Visual Studio 的 Editor</a></li>
<li><a href='http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/' rel='bookmark' title='Permanent Link: 让 Visual Studio 2005 自动生成 Manifest'>让 Visual Studio 2005 自动生成 Manifest</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>征服 Visual Studio 的 Editor</title>
		<link>http://wutiam.net/2009/05/tips-of-visual-studio-editor/</link>
		<comments>http://wutiam.net/2009/05/tips-of-visual-studio-editor/#comments</comments>
		<pubDate>Mon, 11 May 2009 11:09:20 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[vs/vc++]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=87</guid>
		<description><![CDATA[
块选中
类似 UltraEdit 里的“列模式”，按住 Alt 键再移动光标，就可以选择一块范围内的内容，而不必被束缚在只能一行接一行的选中方式了。
整行剪切 / 复制 / 粘贴
平时我都是用鼠标移到一行最左边的行号区去选中一行，然后执行复制或拖动等操作，其实，只要光标在某一行，直接按 Ctrl + X / Ctrl + C，就等于剪切/复制整行了，非常方便。
Clipboard Ring
一直以来，当需要在多个文件中复制粘贴多个内容时，我都很笨地挨个 Ctrl + C / Ctrl + V，从来也懒得想是不是该搞个 multi-clipboard 工具来提高效率 -,-&#124;&#124;&#124;
其实，从 VS2003 开始，VS 就已经内置了多重剪贴板的功能，虽然只支持当前 VS 进程内多文件间的复制粘贴，这就是 Clipboard Ring。Clipboard Ring 采用 LIFO（后进先出）的方式组织，即最后被复制或粘贴的内容排在环的最前面，最大支持 10 块剪贴板。用法很简单，对需要复制的多个内容块按 Ctrl + C，然后到需要粘贴的地方按 Ctrl + Shift + V，选择需要粘贴的内容就 Ok 了。每个 VS 版本的 Clipboard Ring 操作略有不同，在此不赘述了。
代码重构
待续……


Related posts:Visual [...]


Related posts:<ul><li><a href='http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/' rel='bookmark' title='Permanent Link: Visual Studio 2008 无法进入修复/卸载界面的解决办法'>Visual Studio 2008 无法进入修复/卸载界面的解决办法</a></li>
<li><a href='http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/' rel='bookmark' title='Permanent Link: 让 Visual Studio 2005 自动生成 Manifest'>让 Visual Studio 2005 自动生成 Manifest</a></li>
<li><a href='http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/' rel='bookmark' title='Permanent Link: VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert'>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<ul>
<li>块选中</li>
<p>类似 UltraEdit 里的“列模式”，按住 Alt 键再移动光标，就可以选择一块范围内的内容，而不必被束缚在只能一行接一行的选中方式了。</p>
<li>整行剪切 / 复制 / 粘贴</li>
<p>平时我都是用鼠标移到一行最左边的行号区去选中一行，然后执行复制或拖动等操作，其实，只要光标在某一行，直接按 Ctrl + X / Ctrl + C，就等于剪切/复制整行了，非常方便。</p>
<li>Clipboard Ring</li>
<p>一直以来，当需要在多个文件中复制粘贴多个内容时，我都很笨地挨个 Ctrl + C / Ctrl + V，从来也懒得想是不是该搞个 multi-clipboard 工具来提高效率 -,-|||</p>
<p>其实，从 VS2003 开始，VS 就已经内置了多重剪贴板的功能，虽然只支持当前 VS 进程内多文件间的复制粘贴，这就是 Clipboard Ring。Clipboard Ring 采用 LIFO（后进先出）的方式组织，即最后被复制或粘贴的内容排在环的最前面，最大支持 10 块剪贴板。用法很简单，对需要复制的多个内容块按 Ctrl + C，然后到需要粘贴的地方按 Ctrl + Shift + V，选择需要粘贴的内容就 Ok 了。每个 VS 版本的 Clipboard Ring 操作略有不同，在此不赘述了。</p>
<li>代码重构</li>
<p>待续……</ul>


<p>Related posts:<ul><li><a href='http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/' rel='bookmark' title='Permanent Link: Visual Studio 2008 无法进入修复/卸载界面的解决办法'>Visual Studio 2008 无法进入修复/卸载界面的解决办法</a></li>
<li><a href='http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/' rel='bookmark' title='Permanent Link: 让 Visual Studio 2005 自动生成 Manifest'>让 Visual Studio 2005 自动生成 Manifest</a></li>
<li><a href='http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/' rel='bookmark' title='Permanent Link: VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert'>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2009/05/tips-of-visual-studio-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>遍历 CTreeCtrl</title>
		<link>http://wutiam.net/2009/05/ctreectrl-traversal/</link>
		<comments>http://wutiam.net/2009/05/ctreectrl-traversal/#comments</comments>
		<pubDate>Mon, 04 May 2009 11:52:03 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[mfc]]></category>
		<category><![CDATA[vs/vc++]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=74</guid>
		<description><![CDATA[CTreeCtrl 的 GetNextItem 成员函数很诡异，nCode 设为 TVGN_NEXT &#124; TVGN_CHILD 会一直返回传进去的 hItem 值，而不是返回下一个兄弟 item “或”第一个 child item。
所以，只好自己写遍历函数，没有采用递归的做法，用了一个 STL List 容器来保存下一个兄弟 item 和第一个 child item，遍历返回的依据是 item 的 lParam 值等于给定的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
HTREEITEM CModelNodeTreePane::_GetTreeItemByID&#40;const unsigned int uiItemID&#41;
&#123;
    HTREEITEM   hCurrItem = m_kModelNodeTreeCtrl.GetRootItem&#40;&#41;,
                hItem;
 [...]


Related posts:<ul><li><a href='http://wutiam.net/2009/05/msg-response-for-dynamic-created-ctreectrl-instance/' rel='bookmark' title='Permanent Link: 动态创建的 CTreeCtrl 实例的消息响应'>动态创建的 CTreeCtrl 实例的消息响应</a></li>
<li><a href='http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/' rel='bookmark' title='Permanent Link: VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert'>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</a></li>
<li><a href='http://wutiam.net/2009/05/tips-of-visual-studio-editor/' rel='bookmark' title='Permanent Link: 征服 Visual Studio 的 Editor'>征服 Visual Studio 的 Editor</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>CTreeCtrl 的 GetNextItem 成员函数很诡异，nCode 设为 TVGN_NEXT | TVGN_CHILD 会一直返回传进去的 hItem 值，而不是返回下一个兄弟 item “或”第一个 child item。</p>
<p>所以，只好自己写遍历函数，没有采用递归的做法，用了一个 STL List 容器来保存下一个兄弟 item 和第一个 child item，遍历返回的依据是 item 的 lParam 值等于给定的值。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">HTREEITEM CModelNodeTreePane<span style="color: #008080;">::</span>_GetTreeItemByID<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> uiItemID<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    HTREEITEM   hCurrItem <span style="color: #000080;">=</span> m_kModelNodeTreeCtrl.<span style="color: #007788;">GetRootItem</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,
                hItem<span style="color: #008080;">;</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">list</span> kItemList<span style="color: #008080;">;</span>
&nbsp;
    kItemList.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>hCurrItem<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>kItemList.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        hCurrItem <span style="color: #000080;">=</span> kItemList.<span style="color: #007788;">front</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        kItemList.<span style="color: #007788;">pop_front</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>m_kModelNodeTreeCtrl.<span style="color: #007788;">GetItemData</span><span style="color: #008000;">&#40;</span>hCurrItem<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> uiItemID<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">return</span> hCurrItem<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hItem <span style="color: #000080;">=</span> m_kModelNodeTreeCtrl.<span style="color: #007788;">GetChildItem</span><span style="color: #008000;">&#40;</span>hCurrItem<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            kItemList.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>hItem<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hItem <span style="color: #000080;">=</span> m_kModelNodeTreeCtrl.<span style="color: #007788;">GetNextSiblingItem</span><span style="color: #008000;">&#40;</span>hCurrItem<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            kItemList.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>hItem<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>



<p>Related posts:<ul><li><a href='http://wutiam.net/2009/05/msg-response-for-dynamic-created-ctreectrl-instance/' rel='bookmark' title='Permanent Link: 动态创建的 CTreeCtrl 实例的消息响应'>动态创建的 CTreeCtrl 实例的消息响应</a></li>
<li><a href='http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/' rel='bookmark' title='Permanent Link: VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert'>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</a></li>
<li><a href='http://wutiam.net/2009/05/tips-of-visual-studio-editor/' rel='bookmark' title='Permanent Link: 征服 Visual Studio 的 Editor'>征服 Visual Studio 的 Editor</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2009/05/ctreectrl-traversal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>动态创建的 CTreeCtrl 实例的消息响应</title>
		<link>http://wutiam.net/2009/05/msg-response-for-dynamic-created-ctreectrl-instance/</link>
		<comments>http://wutiam.net/2009/05/msg-response-for-dynamic-created-ctreectrl-instance/#comments</comments>
		<pubDate>Mon, 04 May 2009 11:38:39 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[mfc]]></category>
		<category><![CDATA[vs/vc++]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=71</guid>
		<description><![CDATA[由于程序里的 CTreeCtrl 控件实例是通过 CTreeCtr::Create() 来创建的，无法通过 VS 的 Properties 面板里的 Control Events 工具来生成消息映射函数，但控件又需要响应鼠标点击事件，这时最简单的办法就是重载 CTreeCtr 实例的 owner 的 OnNotify() 成员虚函数（这个 owner 也必然是 CWnd 的子类）：

protected:
    virtual BOOL OnNotify&#40;WPARAM wParam, LPARAM lParam, LRESULT* pResult&#41;;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BOOL CTreePane::OnNotify&#40;WPARAM wParam, LPARAM lParam, LRESULT* pResult&#41;
&#123;
    NMHDR* pNMHDR = &#40;NMHDR*&#41;lParam;
    ASSERT&#40;pNMHDR != NULL&#41;;
&#160;
    [...]


Related posts:<ul><li><a href='http://wutiam.net/2009/05/ctreectrl-traversal/' rel='bookmark' title='Permanent Link: 遍历 CTreeCtrl'>遍历 CTreeCtrl</a></li>
<li><a href='http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/' rel='bookmark' title='Permanent Link: VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert'>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</a></li>
<li><a href='http://wutiam.net/2009/05/tips-of-visual-studio-editor/' rel='bookmark' title='Permanent Link: 征服 Visual Studio 的 Editor'>征服 Visual Studio 的 Editor</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>由于程序里的 CTreeCtrl 控件实例是通过 CTreeCtr::Create() 来创建的，无法通过 VS 的 Properties 面板里的 Control Events 工具来生成消息映射函数，但控件又需要响应鼠标点击事件，这时最简单的办法就是重载 CTreeCtr 实例的 owner 的 OnNotify() 成员虚函数（这个 owner 也必然是 CWnd 的子类）：</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">virtual</span> BOOL OnNotify<span style="color: #008000;">&#40;</span>WPARAM wParam, LPARAM lParam, LRESULT<span style="color: #000040;">*</span> pResult<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">BOOL CTreePane<span style="color: #008080;">::</span><span style="color: #007788;">OnNotify</span><span style="color: #008000;">&#40;</span>WPARAM wParam, LPARAM lParam, LRESULT<span style="color: #000040;">*</span> pResult<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    NMHDR<span style="color: #000040;">*</span> pNMHDR <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>NMHDR<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>lParam<span style="color: #008080;">;</span>
    ASSERT<span style="color: #008000;">&#40;</span>pNMHDR <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>pNMHDR<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>code<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">case</span> TVN_SELCHANGED<span style="color: #008080;">:</span>
        _OnTreeCtrlSelChanged<span style="color: #008000;">&#40;</span>wParam, lParam, pResult<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">default</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> CWnd<span style="color: #008080;">::</span><span style="color: #007788;">OnNotify</span><span style="color: #008000;">&#40;</span>wParam, lParam, pResult<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>



<p>Related posts:<ul><li><a href='http://wutiam.net/2009/05/ctreectrl-traversal/' rel='bookmark' title='Permanent Link: 遍历 CTreeCtrl'>遍历 CTreeCtrl</a></li>
<li><a href='http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/' rel='bookmark' title='Permanent Link: VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert'>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</a></li>
<li><a href='http://wutiam.net/2009/05/tips-of-visual-studio-editor/' rel='bookmark' title='Permanent Link: 征服 Visual Studio 的 Editor'>征服 Visual Studio 的 Editor</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2009/05/msg-response-for-dynamic-created-ctreectrl-instance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE8 引发 VS 2005/2008 向导出错的解决方案</title>
		<link>http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/</link>
		<comments>http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 11:07:52 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[vs/vc++]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=4</guid>
		<description><![CDATA[Internet Explorer 8 正式版会导致  Visual Studio 2005 / 2008 里的部分 VC++ 向导出错，包括：

Add Function
Add Variable
Smart Device – New Project Creation
Smart Device – Add Class

VC++ 团队给出了解决方案：

运行注册表编辑器 regedit（64 位系统请使用 32 位版本）
定位到“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet
Settings\Zones”下
新建一个名为 1000 的项
在 1000 这个项下，新建一个 DWORD 值，名为 1207，值为 0x000000

然后重启 VS 即可。
注意：VS 2005 必须装上 SP1。
想深究这个问题原因，可以参看原文。



Related posts:让 Visual Studio 2005 自动生成 Manifest
Visual Studio 2008 无法进入修复/卸载界面的解决办法
VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 [...]


Related posts:<ul><li><a href='http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/' rel='bookmark' title='Permanent Link: 让 Visual Studio 2005 自动生成 Manifest'>让 Visual Studio 2005 自动生成 Manifest</a></li>
<li><a href='http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/' rel='bookmark' title='Permanent Link: Visual Studio 2008 无法进入修复/卸载界面的解决办法'>Visual Studio 2008 无法进入修复/卸载界面的解决办法</a></li>
<li><a href='http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/' rel='bookmark' title='Permanent Link: VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert'>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.microsoft.com/china/windows/internet-explorer/">Internet Explorer</a> 8 正式版会导致  <a href="http://msdn.microsoft.com/en-us/vstudio/">Visual Studio</a> 2005 / 2008 里的部分 VC++ 向导出错，包括：</p>
<ul>
<li>Add Function</li>
<li>Add Variable</li>
<li>Smart Device – New Project Creation</li>
<li>Smart Device – Add Class</li>
</ul>
<p><a href="http://blogs.msdn.com/vcblog/">VC++ 团队</a>给出了解决方案：</p>
<ol>
<li>运行注册表编辑器 <span style="font-family: Calibri; font-size: small;">regedit（64 位系统请使用 32 位版本</span><span style="font-family: Calibri; font-size: small;">）</span></li>
<li><span style="font-family: Calibri; font-size: small;">定位到“</span><span style="font-family: Calibri; font-size: small;">HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet<br />
Settings\Zones</span><span style="font-family: Calibri; font-size: small;">”下</span></li>
<li><span style="font-family: Calibri; font-size: small;">新建一个名为 1000 的项</span></li>
<li><span style="font-family: Calibri; font-size: small;">在 1000 这个项下，新建一个 DWORD 值，名为 1207，值为</span><span style="font-family: Calibri; font-size: small;"> 0x000000</span></li>
</ol>
<p><span style="font-family: Calibri; font-size: small;">然后重启 VS 即可。</span></p>
<p><span style="font-family: Calibri; font-size: small;">注意：VS 2005 必须装上 <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=bb4a75ab-e2d4-4c96-b39d-37baf6b5b1dc&amp;DisplayLang=zh-cn">SP1</a>。</span></p>
<p><span style="font-family: Calibri; font-size: small;">想深究这个问题原因，可以参看<a title="Some VS2005 and VS2008 Wizards Pop Up Script Error" href="http://blogs.msdn.com/vcblog/archive/2009/03/28/some-vs2005-and-vs2008-wizards-pop-up-script-error.aspx">原文</a>。<br />
</span></p>


<p>Related posts:<ul><li><a href='http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/' rel='bookmark' title='Permanent Link: 让 Visual Studio 2005 自动生成 Manifest'>让 Visual Studio 2005 自动生成 Manifest</a></li>
<li><a href='http://wutiam.net/2009/06/uninstalling-visual-studio-2008-may-fail-to-load-setup-components/' rel='bookmark' title='Permanent Link: Visual Studio 2008 无法进入修复/卸载界面的解决办法'>Visual Studio 2008 无法进入修复/卸载界面的解决办法</a></li>
<li><a href='http://wutiam.net/2010/06/lambdas-auto-and-static-assert-c-0x-features-in-vc10/' rel='bookmark' title='Permanent Link: VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert'>VS2010 中的 C++ 0x 新特性：Lambdas、auto 和 static_assert</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2009/04/some-vs2005-and-vs2008-wizards-pop-up-script-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
