LAMBDAS、AUTO和STATICY AsQueT:VC10中的C++ 0x特性,第1部分

Visual C++编译器在微软Visual Studio 2010九月社区技术预览(CTP)中包含支持 C++ 0x语言的特点,即 兰巴斯 , 汽车 , 静态u断言 ,和 R值引用 .  今天,我将详细解释前三个特性。  (在不久的将来,我将用一整篇文章来解释r值引用,因为现在解释它们将使这篇已经很长的文章的长度增加一倍。)

null

首先,简单介绍一下:

今天的帖子是斯蒂芬T。Lavavej,Visual C++库开发人员,字母C,A,T。  注意,作为一个库开发人员,我没有实现这些特性。  这是乔纳森洞穴,前端编译器开发人员,投票标准化委员会成员,和全能忍者的工作。

2、我将VS 2010中的Visual C++编译器称为VC10(VS 2008包含VC9,VS 2005包含VC8等)10不短于2010。

3、C++ 0x是指即将到来的C++标准,它仍然在起草中。  (标准化委员会希望他们在2009完成,使它成为C++ 09;开玩笑的是,如果它滑到2010年或更高版本,“x”将是十六进制的。)  C++ 98和C++ 03是指当前的C++标准。  (在这里没有进行历史讲座,2003 C++标准只是原来的1998 C++标准的“服务包”,大多数人可以忽略这些差异。  C++ 03和C++ 0x完全不同,尽管它们有不同的外观。

4.我要感谢标准化委员会开发了这些非常有用和精心设计的特性。  他们还在网站上提供重要文件:

C++ 0x语言特征状态: http://open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2705.html

C++ 0x库特征状态: http://open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2706.html

C++ 0X工作草案: http://open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2798.pdf

5.总有bug(尽管希望不会太多),这就是CTP的重点。  请通过Microsoft Connect向我们报告错误。

现在,让我们看看这些功能!

兰巴斯

在C++ 0x中,“lambda表达式”隐含地定义和构造未命名的函数对象,这些函数对象像手写函数对象一样运行。  这是“你好,世界”lambda:

C:温度>类型meow.cpp

#包含<算法>

#包括

#包括

#包括

使用名称空间标准;

int main(){

向量v;

对于(int i=0;i<10++(一){

v、 推回(i);

}

对于每个(v.begin(),v.end(), [](int n){cout< );

不能<

}

C:Temp>cl/EHsc/nologo/W4 meow.cpp>num&&meow

0 1 2 3 4 5 6 7 8 9

这个 [] lambda介绍人 ,它告诉编译器lambda表达式正在开始。  这个 (内景) lambda参数声明 ,它告诉编译器未命名函数对象类的函数调用运算符应该采用什么。 最后是 {cout< 复合语句 作为未命名函数对象类的函数调用操作符的主体。  默认情况下,未命名函数对象类的函数调用操作符返回 无效 .

因此,C++ 0x在心理上把这个转化成C++ 98中所写的内容:

C:温度>类型meow98.cpp

#包含<算法>

#包括

#包括

#包括

使用名称空间标准;

结构LambdaFunctor{

void运算符()(int n)const{

不能<

}

};

int main(){

向量v;

对于(int i=0;i<10++(一){

v、 推回(i);

}

对于每个(v.begin(),v.end(), LambdaFunctor() );

不能<

}

C:Temp>cl/EHsc/nologo/W4 meow98.cpp>num和meow98

0 1 2 3 4 5 6 7 8 9

现在我不再说“未命名函数对象类的函数调用操作符返回 无效 开始说“羔羊回来了” 无效 ,但记住lambda表达式的作用很重要:定义类和构造对象。

当然,这个 复合语句 lambda的可包含多个语句:

C:温度>类型multimeow.cpp

#包含<算法>

#包括

#包括

#包括

使用名称空间标准;

int main(){

向量v;

对于(int i=0;i<10++(一){

v、 推回(i);

}

对于每个(v.begin(),v.end(), [](int n){

不能<

如果(n%%2==0){

cout<<“偶数”;

}其他{

cout<<“奇数”;

}

} );

不能<

}

C:Temp>cl/EHsc/nologo/W4 multimeow.cpp>NUL和multimeow

0偶1奇2偶3奇4偶5奇6偶7奇8偶9奇

现在,兰姆达斯不必总是回来 无效 .  如果一只羔羊 复合语句 {返回 表达 ; } ,则lambda的返回类型将自动推断为 表达 :

C:温度>类型cubicmeow.cpp

#包含<算法>

#包括

#包括

#包括

#包括

#包括

使用名称空间标准;

int main(){

向量v;

对于(int i=0;i<10++(一){

v、 推回(i);

}

德克d;

变换(v.begin(),v.end(),前插入器(d), [](int n){返回n*n*n;} );

对于_each(d.begin(),d.end(),[](int n){cout<

不能<

}

C:Temp>cl/EHsc/nologo/W4 cubicmeow.cpp>NUL和cubicmeow

729 512 343 216 125 64 27 8 1 0

这里是 n*n*n号 内景 ,所以这个lambda的函数调用操作符返回 内景 .

更复杂的Lambdas 复合语句 我们不会得到自动推断的返回类型。  必须明确指定它们:

C:温度>类型returnmeow.cpp

#包含<算法>

#包括

#包括

#包括

#包括

#包括

使用名称空间标准;

int main(){

向量v;

对于(int i=0;i<10++(一){

v、 推回(i);

}

德克d;

变换(v.begin(),v.end(),前插入器(d), [](int n)->双精度{

如果(n%%2==0){

返回n*n*n;

}其他{

返回n/2.0;

}

} );

对于_each(d.begin(),d.end(),[](双x){cout<

不能<

}

C:Temp>cl/EHsc/nologo/W4 returnmeow.cpp>NUL和returnmeow

4.5 512 3.5 216 2.5 64 1.5 8 0.5 0

这个 ->双倍 是可选的吗 lambda返回类型子句 .  为什么它不在左边,就像程序员在C函数上做的事情比我活着的时间要长?  因为那时 lambda介绍人 不会先出现,这就是告诉编译器lambda表达式开始的原因。  (搞清楚这类事情是核心工作组擅长的;试着想象一个给定的结构是否在C++中是可损伤的。

如果你忘了 lambda返回类型子句 ,编译器会抱怨

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享