9.2.2 实现的完整性
现在许多C++(www.cppentry.com)编译器并没有完全实现整个语言,也并不是所有的C++(www.cppentry.com)编译器都实现了模板和异常处理,而这两者在1990年就已经提出来了。只有等到所有的(或大多数)C++(www.cppentry.com)的实现都符合ANSI/ISO标准,C++(www.cppentry.com)程序员编写的、符合C++(www.cppentry.com)子集的代码,才可以被他们希望移植其上的平台所支持。当这本书出版的时候,并不是所有C++(www.cppentry.com)编译器都完全支持这样的一系列C++(www.cppentry.com)的新特性,这包括异常处理、运行时类型信息、成员函数返回类型的协变、名字空间、bool类型、mutable关键字、新的cast语法(static_cast,reinterpret_cast和const_cast)、模板的默认参数和模板内的模板参数。而且,某些C++(www.cppentry.com)编译器还没有完全实现嵌套类:
- class A {
- public:
- class B; //能实现吗
- class C {
- void f();
- };
- };
- void A::c::f() {} //能实现吗
上面嵌套类B不完全的声明,和嵌套类C的函数f的定义,也并不为所有的C++(www.cppentry.com)编译器所支持;某些编译器就算支持了这些结构,也可能不支持模板版本的这些特性(就是把上面的A改变为一个模板类之后的代码)。更严重的是,少数编译器甚至仍然不支持模板(这将导致许多可移植性问题,我们会在练习9.7看到这一点)。
当写这本书的时候,大多数C++(www.cppentry.com)编译器的实现都是不完整的;因此,就有某些实现提供了对C++(www.cppentry.com)的扩展(即不符合标准的特性)。例如大多数运行在个人计算机的C++(www.cppentry.com)版本,为了使程序员可以操作系统中的某些进程,都会定义near和far关键字,但这种设计终究是不符合标准的。因此,使用扩展特性的程序员应该充分注意,他们正在阻止其代码失去将来可以移植到其他平台的可移植性。