摘要: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.