C++11 有感 (VC10)
主要参考 http://coolshell.cn/articles/5265.html,和http://blog.csdn.net/lanphaday/article/details/6564162。
参考此文章中得内容将标记为[coolshell]与[csdn]。
我的编译环境是vs2010(没有打sp1补丁)
下面是我的一些补充,可以参看两片原文比较着看。
1. Lambda表达式
引入目的:C++中有了lambda函数,这令声明式编程以及使用STL运算法则变得更加简洁。在为编译器提供强大的优化提示之外,Lambda函数所推崇的代码模式可以令人更加简单的理解哪段代码是要实现怎样的功能。Visual C++ 2010将带来在并行处理上的显著功能提升,而lambda函数将是具体实现这些提升的重要手段之一。 (摘自http://news.newhua.com/news1/program_language/2009/55/095515408G6HD4FE6B80D9GB5E841K9D878DHHF4CBI94G564FJG53.html?lt=common)
[coolshell]认为C++引入Lambda的最主要原因就是1)可以定义匿名函数,2)编译器会把其转成函数对象。
语法
[capture](parameters)->return_type {body}
使用实例
int Uppercase = 0; //modified by the lambda
bool bNeedCal = true;
std::for_each(s, s + sizeof(s), [&total, bNeedCal](char x) -> void{
if (bNeedCal){
if (isupper(c))
Uppercase++;
} });
先说明一下语法中的capture。个人的理解就是让外部变量在lambda表达式中可以被引用。而这样的引用又区别于传入的参数(上例中的x),他们更多像是直接被“捕捉”到lambda表达式中。
第一个引用捕捉(&total)则表示了被捕捉的total 能够在lambda中被改写,即[csdn] & 的意义是 total 是个引用,lambda函数中能够改变它的值,如果没有 &,那就 Uppercase 将以传值的形式传递过去。而第二个是副本捕捉(bNeedCal),它仅仅可以被使用,但是不能够被改写,类似于被定义了const。如果被改写,那么vs2010编译器会报错。
另外,在必要的时候,也可以不用捕捉,但是[]必须被保留。
2. 关于auto 和delctype
个人感觉auto在做迭代器的省略(下面第一个例子)会有点用处,其他的地方,如模板的返回(第二个例子)等,感觉如果用上了会使得代码的可读性降低。
// 可以被写成
auto ci = vi.begin();
decltype 在[coolshell]讲得很清楚,直接看就是了。
3. 统一的初始化语法
这里我在vs2010上尝试了[coolshell]里面的几个例子,但是貌似没有一个是成功的。难道是我C++11的编译开关没有开?但是auto和lambda表达式都是ok的。
4. Delete 和 Default 函数
vs2010上貌似目前还没有实现
5. nullptr
很好理解,不多说了,以后要使用这样的代码,而不是使用NULL了。
if (c != nullptr) {...}
6. 委托构造
没有试成功额。
7. 右值引用
其实我不是很明白这个的用意,不过通过下面的代码试了一下,编译就挂了。不知道是我没有理解还是怎么着。
{
string &&temp = a;
a=b;
b=temp;
}
string str1 = "abc";
string str2 = "efg";
naiveswap((string&&)str1, (string&&)str2);
看到MSDN上一篇文章 ,终于明白了,我们要等到VC11才能够看到对这些特性的支持。
http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
------------------------------------------------------------------------
email : aicrosoft1104@126.com
吃遍天下。