摘要:C++标准委员会近年来一直在为下一代C++标准的制定而努力着,本文介绍了几个很可能成为下一代标准的新特性,包括generalized initialization,concept,move semantics,auto/delctype,让大家先睹为快。 1. 什么是C++0x 很简单,0x代表21世纪的第一个十年中的某一年,可能是07也可能是09,这要视标准出台的具体时间而定(但放心,不会是99),这也意味着新标准出台的时间不会太遥远了。 2. 新特性 这里我只打算从直观的角度介绍每一个新特性,关于每一个特性都可以在“C++ Standards Committee Papers”找到相应的论文。 2.1 Generalized Initialization 描述:支持将形如{1,2,3}的initializer作为参数进行传递 意义:相信你一定写过这样的代码吧: vector <int> v; v.push_back(1); v.push_back(2); v.push_back(3); 有了上述机制,只要给vector多加一个initializer为参数的构造函数,代码就可以简化为: vector <int> v = {1,2,3}; 世界本应如此简单,不是吗。 2.2 Concept 描述:从语言层面支持STL的concept概念 如下代码定义了一个EqualityComparable的concept,满足该concept的对象都应该可以相等性的比较: template<class T> concept EqualityComparable { bool operator ==(T x, T y); bool operator !=(T x, T y); }; 意义: a. 对模板可以在更早的时间进行类型检测 众所周知,C++现在的模板实现是基于实例展开的,因此类型检测也要到展开 以后才能发现。一旦有了concept,编译器就可以在模板展开前发现类型错误, 这无疑提高了编译器的效率。 b. 更加易懂的出错信息 用过STL的人都知道,STL的出错信息从来都是一堆乱码,可读性为0。Concept 可以给编译器提供更多的类型信息,从而反馈给开发人员更加易于理解的信息, 如"xxx is not EqualityComparable",而不是告诉你"xxx did not define this operator"。 c. 使C++中的模板更加完整、健壮 事实上,在[SGGWJL05]中提到了好几个因此可以被废弃的trick。如果一个语言 需要用许多trick来实现某些东西,那么这个语言在至少某些方面是不完整的。 2.3 Move semantics 描述:以专门的方式表达对右值的引用(目前倾向于使用&&) 意义: a. 有助于提高程序的效率 右值是无名的数据,例如函数的返回值一般说来就是右值。当对右值进行操作的 时候,右值本身往往没有必要保留,因此在某些情况下可以直接“移动”之。 引入move semantics的用意就在于此,通过右值引用,程序可以明确的区分出 传入的参数是否为右值,从而避免了不必要的拷贝,程序的效率也就得到了提高。 一个典型的例子是字符串连接操作,详见[HDA02]。 b. 成就所谓的perfect forwarding 这方面就不展开讲了,可以参考[DHA02]。 2.4 auto/decltype 描述:引入auto/decltype类型修饰关键字,编译器可以根据表达式来推导出相应的类型 意义: C++本身不支持类型反射机制(即在运行时判断某对象的类型),这给泛型编程带来了 一定的困难。因为在泛型编程中,确定某个返回类型往往是一件很麻烦甚至是不可能的 事情,但是编译器展开模板以后知道所有的类型信息,为什么不把这件事交给编译器 去做呢。更详细的资料可以参考[JSGS03]和[TO05]。 3. 参考文献 [SGGWJL05] Jeremy Siek, Douglas Gregor, Ronald Garcia, Jeremiah Willcock, Jaakko J?rvi, and Andrew Lumsdanine. Concepts for C++0x. C++ standards committee document N1758=05-0018, Januaury 17, 2005.[HDA02] Howard E. Hinnant, Peter Dimov, and Dave Abrahams. A Proposal to Add Move Semantics Support to the C++ Language. C++ standards committee document N1377=02-0035, September 10, 2002.[DHA02] Peter Dimov, Howard E. Hinnant, and Dave Abrahams. The Forwarding Problem: Arguments. C++ standards committee document N1385=02-0043, September 09, 2002.[JSGS03] Jaakko J?rvi, Bjarne Stroustrup, Douglas Gregor, and Jeremy Siek. Decltype and auto. C++ standards committee document N1478=03-0061, April 2003.[TO05] Thorsten Ottosen. Towards C++0x. October 24, 2005.

评论