GCC 4.4.1 发布在即,C++ 0x 标准实验性支持大幅进步
{撰文/guest}
前些日 GCC 4.4 版发布,对 C++ 0x 标准的支持有了大幅的提升,但是没看到有什么消息报道。今日到 GCC 网站看,得知 4.4.1 版本发布在即,故投稿一封。
请注意,以下所有特性都需要在命令行指定 -std=gnu++0x
或
-std=c++0x
来启用!!
GCC 4.4 相对于 4.3 版最大的变化就是对 C++ 0x
标准支持有了大幅提升(当然,还有很多其他方面的改变,不过我个人比较关注
C++),已支持的 0x 特性中,thread 已经可用,api 方面基本上与 pthread
规范相一致,熟悉 pthread 的人能很快上手。因为 pthread
规范已经非常成熟,所以在 C++ 中支持 thread 只是标准方面的问题(看 4.4
的头文件可知,在支持 pthread 的平台上,mutex 和 condition\_variable
等直接映射到 pthread 相应类型),不过,C++
作用域之后变量被析构,使得程序员可以直接在临界区的作用域内声明
lock\_guard
容器方面,forward\_list 被加入,vector 等已有的容器增加了 cbegin,cend
来返回 const\_iterator,并且最重要的,是对 Initializer
lists--初始化列表的支持。以往对容器一些初始元素的置入,只能是声明容器后用
push\_back 等方法调用,而现在,你可以这样用 vector
另一个好东西就是 auto,你可以不必写 map>>::const_iterator it=container.begin()(当然只是举例子...),而直接用 auto it=container.begin(),类型推导就交给编译器吧。另一个小的但是方便的变化是你可以这样写 vector > 而不用写 vector 空格>。
对于构造函数,拷贝构造函数等的一些方便性的问题上,default 和 delete 已被支持。过去,自定义了构造函数后,默认的构造函数便不再自动生成,带来些语法上的麻烦,但是现在你可以这样写: constructor()=default:仍然有默认的构造函数。类不可复制:constructor(const xx&)=delete。诡异的“模板函数不能有默认模板参数”问题已解决。
以上这些只是我稍有了解的部分,相对 4.3 的全部变化,请看原页面 。比较可看出,4.4 相对 4.3 只增加了一些 tr1 的扩展来说,改变还是很大的。
为了第一时间尝鲜,我没有在 Linux 下编译 4.4,而是使用了别人编译的 GCC 4.4 win32 版,页面 ,我实验的这些特性中,win32 版的 GCC 是不能使用 thread 的,我加入了 pthread-for-win32,又定义了 GCC 头文件中几个控制 thread 库是否被支持的宏,仍然没有成功将 thread 带入 std 命名空间,最后一次成功带入,链接时却报错与 pthread-for-win32 中一个 time 结构冲突,故想完全体验 4.4 thread 好处的同志们请使用 Linux 版。另外,我个人声明,我使用 c/c++/java/c#(样样稀松),所以希望这个贴不要成为各个语言 fans 的 pk 场...喜欢 C++ 的同志看看,不喜欢的,也可以彼此借鉴借鉴。此次 0x 标准中借鉴了其他语言的长处,如契约概念(类似于 java 中 comparable,xxxable)lambda 表达式(C#已支持)而 java 的泛型,java7 的初始化列表等概念也从 c++ 中得到经验和教训(或许这些所说只是谁先有了实现的问题),语言的不断进步,我们也可得到更好的编程体验。