当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

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.

相关内容
赞助商链接