编译时的重大更改摘要
更新:2007 年 11 月
本主题概括介绍现在将对代码发出的编译时错误和警告,在 Visual C++ 2003 之前,该代码在编译时未出现错误或警告。但是,Visual C++ 2005 中引入了某些与一致性相关的编译时重大更改。
定义的预处理器指令现在需要右括号 (C2004)。
缺少 typename 关键字,并且显式专用化不再从主模板查找模板参数 (C2146)。
受保护成员 (n) 只能通过类 (B)(该类从 (n) 是其成员的类 (A) 继承)的成员函数访问 (C2247)。
编译器中改进的可访问性检查现在检测不可访问的基类 (C2247)。
显式专用化不能是复制构造函数或复制赋值运算符 (C2299)。
如果析构函数和/或复制构造函数不可访问,则无法捕获异常 (C2316)。
不再允许指向函数的指针上的默认参数 (C2383)。
静态数据成员无法通过派生类初始化 (C2477)。
标准不允许对 typedef 初始化,并且初始化现在将生成编译器错误 (C2513)。
bool 现在是正确的类型 (C2632)。
对于重载运算符,UDC 现在可能会产生多义性 (C2666)。
限定转换不同于标识转换 (C2666)。
更多的表达式现在被视为有效的 null 指针常量 (C2668)。
template<> 在以前编译器要推断的位置现在是必需的 (C2768)。
如果已通过模板类专用化对类外部成员函数进行了显式专用化,则该函数的显式专用化无效。 (C2910)。
对于每个显式专用化,必须选择每个显式专用化的参数,以使其与主模板的参数匹配 (C2912)。
不再允许浮点非类型模板参数 (C2993)。
类模板不允许作为模板类型参数 (C3206)。
不再将友元函数名称引入包含命名空间 (C3767)。
增强了指向成员的指针一致性 (C3867)。
编译器将不再在宏中接受多余逗号 (C4002)。
使用 () 形式的初始值设定项构造的 POD 类型的对象将被默认初始化 (C4345)。
如果依赖名称将被视为一个类型,则 typename 现在是必需的 (C4346)。
以前被不正确视作模板专用化的函数不再被视作模板专用化 (C4347)。
静态数据成员无法通过派生类初始化 (C4356)。
在返回类型中使用类模板专用化之前需要对其进行定义 (C4686)。
编译器现在将报告无法访问的代码 (C4702)。
必须定义声明新的非模板函数的友元声明 (LNK2019)。