现在的位置: 首页 > 综合 > 正文

C++的进化:C++0x一瞥

2018年02月14日 ⁄ 综合 ⁄ 共 2217字 ⁄ 字号 评论关闭

C++的进化:C++0x一瞥

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

抱歉!评论已关闭.