http://msdn.microsoft.com/en-us/library/dd465215%28VS.100%29.aspx
可以看到VC2010有以下变化:
1)MFC部分增加了CTaskDialog,这个应该是windows7的样式,在toplanguage上有人唱衰MFC,不过个人认为MFC与VC++应该是同生共存的关系。
这个对于VC++来说算是个有意思的东西,尽管大部分的解释型语言(如ruby,python,lua)都有lambda的支持。
3)static_assert
这个东西在boost也有实现,就是boost::static_assert。简单说就是让assert功能在编译时就可以工作,如果出现错误,可以在编译过程中输出错误结果。
有一些讨论可以参考这里。
在这里想多说两句lambda,比较一下vc++与lua的实现。lambda可以粗略认为是一个匿名函数,由于c++不支持嵌套函数,所以lambda实现是这样的:
// even_lambda.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 10; ++i)
{
v.push_back(i);
}
int evenCount = 0;
// 加色标粗部分就是lambda,实现功能是对于传入的数字进行奇偶判断。
for_each(v.begin(), v.end(), [&evenCount] (int n) {
cout << n;
if (n % 2 == 0)
{
cout << " is even " << endl;
evenCount++;
}
else
{
cout << " is odd " << endl;
}
});
cout << "There are " << evenCount << " even numbers in the vector." << endl;
}
// 另外一个例子,定义了一个function对象
// compile with: /EHsc
#include <iostream>
#include <functional>
int main()
{
using namespace std;
using namespace std::tr1;
int i = 3;
int j = 5;
// 函数声明部分。在这里需要注意的是j是传引用,而i是传值,所以lambda会保存一份i的拷贝
function<int (void)> f = [=, &j] { return i + j; };
// Change the values of i and j.
i = 22;
j = 44;
// 当我们调用f的时候,lambda中的i没有随着本地变量的变化而变化,依然是3.
cout << f() << endl;
// 最终打印结果为47 }
我们使用lua来模拟一下就是这样的
local i, j = 3, 5
local function func_(j)
local i = i
return function(j)
return i+j
end
end
local f= func_()
i, j = 22, 44
print(f(j))
这里使用了尾调用来实现对于局部变量i的缓存,我原来以为lua是会保存一份i的值,可惜我的想法是不对的,嘿嘿。
对于lua来说,i和j的捕获应该是在第二次对ij赋值以后,python好像也是如此,大家可以试试下面的python代码。
i = 2
j = 3
def f (x):
return i + x
i = 22
j = 44
print(f (j))
结果就是66.
关于lambda,大家可以参看这篇文字:
http://blog.csdn.net/hikaliv/archive/2009/09/08/4532958.aspx
或者直接看原文。