boodweb的专栏

钱海波ID:boodweb
[修改头像]
3193次访问,排名2万外好友0人,关注者0
boodweb的文章
原创 6 篇
翻译 0 篇
转载 0 篇
评论 24 篇
最近评论
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    我的主页
    沧海一粟
    存档

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

    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.

    发表于 @ 2005年11月22日 19:48:00|评论(loading...)|编辑

    旧一篇: CMinus编译器0.3版(含源代码)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © boodweb