Visual C++编译器在微软Visual Studio 2010九月社区技术预览(CTP)中包含支持 四 C++ 0x语言的特点,即 兰巴斯 , 汽车 , 静态u断言 ,和 R值引用 . 今天,我将详细解释前三个特性。 (在不久的将来,我将用一整篇文章来解释r值引用,因为现在解释它们将使这篇已经很长的文章的长度增加一倍。)
首先,简单介绍一下:
今天的帖子是斯蒂芬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(){
向量
对于(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(){
向量
对于(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(){
向量
对于(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(){
向量
对于(int i=0;i<10++(一){
v、 推回(i);
}
德克
变换(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(){
向量
对于(int i=0;i<10++(一){
v、 推回(i);
}
德克
变换(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返回类型子句 ,编译器会抱怨