C++03 变更与修正
值初始化(Value Initialization)
C++03 明确了三种初始化语义:
cpp
int a; // 默认初始化(对内置类型:不确定值)
int b = int(); // 值初始化(对内置类型:零初始化)→ b = 0
int c(); // 注意:这是函数声明!(最令人头疼的解析)对于类类型:
cpp
struct Widget {
int x;
double y;
};
Widget w1; // 默认初始化:调用默认构造函数
Widget w2 = Widget(); // 值初始化:先零初始化,再调用默认构造函数模板两阶段名称查找
C++03 细化了模板中名称查找的两阶段规则:
- 第一阶段(模板定义时):查找非依赖名称
- 第二阶段(模板实例化时):查找依赖名称
cpp
template<typename T>
void foo(T t) {
bar(t); // 依赖名称 — 第二阶段查找
baz(); // 非依赖名称 — 第一阶段查找
}这确保了模板代码在定义时就能检测到一部分错误,而不需要等到实例化。
其他修正
std::allocator的成员函数修正- 异常规范的行为细化
- 若干库实现的缺陷报告修复