Visual Studio 2010中的C++提供了对C++0x的支持,还是比较令人期待的。本文基本上是网上同名的《VC10中的C++0x特性》的缩水版,由于VC10及C++0X还没有出来,因此,并没有深入介绍,对此感兴趣的朋友可以参看原文和相关资料(还是蛮多的)。
Lambda表达式
lambda 表达式是实现匿名函数的一种编程技巧,它为编写匿名函数提供了简明的函数式的句法。在Basic和C#等语言中已经对其进行了支持,在C++0x中对其正式进行了支持(boost中的lambda库也可以为c++程序提供lambda支持)。如下是一个简单的实例。
int main()
{
vector<int> v;
for (int i = 0; i < 10; ++i)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), [](int n) { cout << n << " "; });
cout << endl;
}
[] 操作符是 lambda 导引符, 它告诉编译器一个 lambda 表达式开始了。 (int n) 是 lambda 参数声明,它告诉编译器不具名函数对象类的函数调用操作符带有哪些参数, { cout << n << " "; } 是复合声明,它是不具名函数对象类的函数调用操作符的函数体。不具名函数对象类的函数调用操作符默认返回 void。语法和C# 2.0的匿名函数非常类似,比较简单,就不多介绍了。
auto关键字
关键字auto 是从 C++ 98 得来的,它在 C++ 98 中实际上并没起什么作用,但在 C++ 0x 中被重用于自动类型推导(automatic type deduction)。 在一个声明中使用 auto ,意味着"让它和初始化它的事物具有相同的类型"。在C#中也有一个类似的关键字var。
#include
<iostream>
#include <map>
#include <ostream>
#include <regex>
#include <string>
using
namespace std;
using
namespace std::tr1;
int main() {
map<string, string> m;
const regex r("(\w+) (\w+)");
for (string s; getline(cin, s); ) {
smatch results;
if (regex_match(s, results, r)) {
m[results[1]] = results[2];
}
}
for (auto i = m.begin(); i != m.end(); ++i) {
cout << i->second << " are " << i->first << endl;
}
}
通过它可以简化代码,终于可以和那些各式各样的iterator说再见了。
右值引用
右值引用(rvalue references)也被引入到 C++0x中。我们可以通过操作符"&&"来声明一个右值引用,原先在C++中使用"&"操作符声明的引用现在被称为左值引用。 左值引用和右值引用的唯一的差别就是右值引用可以绑定到一个临时对象(右值)上,而左值引用不可以。例如:
int& a_lvref = int(); // error C2440: 'initializing' : cannot convert from 'int' to 'int &'
int&& b_rvref = int(); // OK!
右值是无名的数据,例如函数的返回值一般说来就是右值。通过右值引用,程序可以明确的区分出传入的参数是否为右值,从而避免了不必要的拷贝,从而提高效率。