1.4.4 专家新手一概支持

如果C++只是适合专家的语言,那它就不可能是一门成功的语言。C++中虽然有许多专家级的特性,但这并不是必须学习的。通常程序员只需要学习一定的知识就可以使用C++。而在C++11中,从易用的角度出发,修缮了很多特性,也铲除了许多带来坏声誉的“毒瘤”,比如一度被群起而攻之的“毒瘤”——双右尖括号。在C++98/03中,由于采用了最长匹配的解析规则(maximal munch parsing rule),编译器会在解析符号时尽可能多地“吸收”符号。这样一来,在模板解析的时候,编译器就会将原本是“模板的模板”识别为右移,并“理直气壮”地抛出一条令人绝望的错误信息:模板参数中不应该存在的右移。如今这个问题已经在C++11中被修正。模板参数内的两个右尖括号会终结模板参数,而不会导致编译器错误。当然从实现上讲,编译器只需要在原来报错的地方加入一些上下文的判断就可以避免这样的错误了。比如:


vector<list<int> >veclist://C++11中有效,C++98/03中无效


另一个C++11易于上手的例子则是统一初始化语法的引入。C++继承了C语言中所谓的“集合初始化语法”(aggregate initialization syntax,比如a[]={0,1,};),而在设计类的时候,却只定义了形式单一的构造函数的初始化语法,比如A a(0,1)。所以在使用C++98/03的时候,编写模板会遇到障碍,因为模板作者无法知道模板用户会使用哪种类型来初始化模板。对于泛型编程来说,这种不一致则会导致不能总是进行泛型编程。而在C++11中,标准统一了变量初始化方法,所以模板作者可以总是在模板编写中采用集合初始化(初始化列表)。进一步地,集合初始化对于类型收窄还有一定的限制。而类型收窄也是许多让人深夜工作的奇特错误的源头。因此在C++11中使用了初始化列表,就等同于拥有了防止收窄和泛型编程的双重好处。

读者可以在第4章看到C++11是如何增进语言对新手的支持的。