技术开发 频道

C++0x探秘:访C++之父Bjarne Stroustrup

    【IT168 专稿】C++0x作为C++的下一个国际标准,已经在业界热炒多年。但是,尽管业界对这个新标准千呼万唤,她总是不愿意过早地来到我们面前。在最近一次CodeGuru对C++之父Bjarne Stroustrup博士的采访中,C++之父终于给我们带来了好消息——C++0x的标准化工作已经接近尾声,C++0x呼之欲出。下面是整个采访过程的节选,我们可以通过这个访谈,掀起C++0x的盖头来,了解C++0x的最新进展,新的特性以及未来的计划。

  Danny Kalev: C++0x的标准化过程进展如何?我们现在有多么接近这个新的C++标准?

  Bjarne Stroustrup: 我们计划在2011年3月26日进行最终的技术投票。虽然其后还会进行正式的国家投票以及ISO官僚主义的拖延,但是我十分相信,我们会在2011年使这个官方的标准来到我们面前。

  Danny Kalev: 在所有关于C++0x的核心特性以及库的改进中,C++0x为一个典型的C++程序员带来了哪些好东西?C++0x的哪些方面使您特别骄傲?最后,鉴于目前市面上还缺少关于C++0x的相关教材和资料,对于程序员们学习和使用C++0x的新特性您有什么建议?

  Bjarne Stroustrup: C++0x对于C++的改进是以许多小的语言特性的改进以及部分新特性的增加的形势出现的,并不是对C++革命性的更新。我猜想,许多改进对于大多数人而言并不是十分重要的,但是会让C++变成一门更好的程序设计语言。但是这一点也并不会影响我的核心观点:C++0x的改进弥散地分布在C++语言的各个部分;它们在许多地方以多种形式改善我们的C++代码;并不像人们通常理解的改进一样,被隔离成某一个独立的新增加的组件。更形象地说,我认为C++0x的改进就像我们获得了很多新的种类的砖块,这样我们可以构建很多以前无法轻松构建的建筑,并且更加容易和灵活优雅。实际上,使用C++0x,我总是能够写出比使用C++98更加简单更加优雅的程序,并且,通常也会有更高的性能。

  当我们首先来看几个可以让C++程序员的生活更加轻松惬意的C++0x改进。考虑下面这段代码:

  void f(vector>& vp)

  {

  
struct is_key {

  
string s;

  
bool operator()(const pair&p)

  {

  
return p.first == s;

  }

  };

  auto p
= find_if(vp.begin(), vp.end(),

  is_key{
"simple"});

  
//

  }

  这段代码看起来并没有什么激动人心的新改进,但是我要指出其中有四个小特性是C++98所不具备的:

  1. 在“vector>”中,第一个“>”和第二个“>”之间并没有空格,我认为这是C++0x中最小的改进,但是却可以省去程序员们添加空格的繁琐。

  2. 我定义了一个变量p但是并没有明确地指出它的数据类型,作为替代,我使用了auto作为其数据类型,这就意味着“使用初始器(initializer)的数据类型”,所以p的数据类型就是vector>::iterator。这将节省程序员编码以及调试可能出现的Bug的时间。这是C++0x最“老”的新特性,我在1983年就实现了这个特性,但是因为一些兼容性问题,这一特性一直没有被纳入C++标准。

  3. 局部结构体is_key被用作模板参数类型,也许你并没有注意到这一点,但是这样的用法在C++98中是非法的。

  4. 最后,我使用初始器{"simple"}创建了一个键。在C++98中,我们只能够以这样的方式初始化一个变量而不能初始化一个函数参数。C++0x通过“{...}”操作符,提供了一致的初始化方式。

  我们还可以利用Lambda表达式进一步简化这个例子:

  void f(vector>& vp)

  {

  auto p
= find_if(vp.begin(), vp.end(),

  [](
const pair&p)

  {

  
return p.first=="simple";

  });

  
//

  }

  Lambda表达式是对函数对象的定义和使用的一种简化。这里,我们使用Lambda表达式简单地表示了find_if()算法的谓语使用pair作为参数并将其第一个元素与“simple”进行比较。

0
相关文章