C++03 标准详解:C++98的技术修订版
C++03 标准详解:C++98的技术修订版
C++03(ISO/IEC 14882:2003)是C++98的一个技术修订版本,正式名称为"C++ Programming Language, Second Edition"。它主要修正了C++98标准中的一些缺陷和模糊之处,没有引入重要的新特性,但澄清了许多语言细节。
一、C++03相较于C++98的主要变化
1. 标准库修正与澄清
容器成员函数异常安全性保证
std::vector<int> v;
v.push_back(1); // 明确规定了基本异常安全保证
流状态处理更明确
std::ifstream file("data.txt");
if (!file) { // 流状态检查更规范// 错误处理
}
2. 模板相关澄清
模板定义点规则
template<typename T>
void f(T); // 声明template<typename T>
void f(T t) { // 定义// 实现
}
模板友元声明
template<typename T>
class Foo {friend void bar(Foo<T>); // 友元声明更明确
};
3. 初始化列表澄清
数组初始化
int a[] = {1, 2, 3}; // 初始化语法更规范
静态成员初始化
class Widget {static const int size = 10; // 允许类内初始化整型静态常量
};
4. 异常规范调整
不推荐使用动态异常规范
void func() throw(std::exception); // 不推荐但保留
二、标准库的微小改进
1. 新增标准库头文件
#include <cstdint> // 提供固定宽度整数类型
2. 值初始化语法
int* p = new int(); // 值初始化为0
int* q = new int; // 默认初始化(未初始化)
3. 导出模板(export)的模糊处理
// export template<typename T> void f(T); // 实现困难,多数编译器不支持
三、与C99的兼容性
1. 新增C99兼容头文件
#include <cstdbool> // bool宏定义
#include <cstdint> // 固定宽度整数类型
2. 预定义宏
__STDC_HOSTED__ // 指示是否在宿主环境中实现
四、其他技术修正
1. 类型定义一致性
typedef std::vector<int> IntVector; // 使用更一致
2. 模板特化规则
template<>
class Widget<int> { // 特化规则更明确// 特化实现
};
3. 名称查找规则
namespace N {int x;
}
int x;
using namespace N;
x = 1; // 错误,歧义(比C++98更明确)
五、总结
C++03的主要变化:
- 缺陷修复:修正了C++98标准中的约100处问题
- 标准库澄清:明确了容器、流等组件的具体行为
- 模板规范:完善了模板相关规则和特化机制
- 兼容性增强:部分采纳了C99的特性
- 语法一致性:统一了初始化等语法规则
虽然C++03没有引入引人注目的新特性,但它为C++语言的稳定性和可移植性做出了重要贡献,为后续C++11的重大变革奠定了基础。
