非标准行为

以下几节将列出 C++ 的 Microsoft 实现不符合 C++ 标准的几处内容。 下面给出的章节号引用了 C++ 11 标准 (ISO/IEC 14882:2011 [E]) 中的章节号。

编译器限制中列出了与 C++ 标准中所定义的限制不同的编译器限制。

协变返回类型

当虚函数具有可变数量的自变量时,不支持虚拟基类作为协变返回类型。 这不符合 C++ 11 ISO 规范第 10.3 节第 7 段的要求。 以下示例没有编译;它会生成编译器错误 C2688

// CovariantReturn.cpp
class A
{
   virtual A* f(int c, ...);   // remove ...
};

class B : virtual A
{
   B* f(int c, ...);   // C2688 remove ...
};

绑定模板中的非依赖性名称

在最初分析模板时,Microsoft C++ 编译器暂不支持绑定非依赖性名称。 这不符合 C++ 11 ISO 规范的第 14.6.3 节的要求。 这可能导致在模板之后(但在模板实例化之前)声明的重载出现。

#include <iostream>
using namespace std;

namespace N {
   void f(int) { cout << "f(int)" << endl;}
}

template <class T> void g(T) {
    N::f('a');   // calls f(char), should call f(int)
}

namespace N {
    void f(char) { cout << "f(char)" << endl;}
}

int main() {
    g('c');
}
// Output: f(char)

函数异常说明符

分析但不使用除 throw() 以外的函数异常说明符。 这不符合 C++ 11 ISO 规范的第 15.4 节的要求。 例如:

void f() throw(int); // parsed but not used
void g() throw();    // parsed and used

有关异常规范的详细信息,请参阅异常规范

char_traits::eof()

C++ 标准声明 char_traits::eof 不能对应于有效的 char_type 值。 Microsoft C++ 编译器对 char 类型强制实行该约束,但不对 wchar_t 类型实行。 这不符合 C++ 11 ISO 规范的第 12.1.1 节中表 62 的要求。 下面的示例说明了此行为。

#include <iostream>

int main()
{
    using namespace std;

    char_traits<char>::int_type int2 = char_traits<char>::eof();
    cout << "The eof marker for char_traits<char> is: " << int2 << endl;

    char_traits<wchar_t>::int_type int3 = char_traits<wchar_t>::eof();
    cout << "The eof marker for char_traits<wchar_t> is: " << int3 << endl;
}

对象的存储位置

C++ 标准(第 1.8 节第 6 段)要求完整的 C++ 对象具有唯一的存储位置。 但是,在使用 Microsoft C++ 时存在这样的情况:没有数据成员的类型会在对象的生命周期内与其他类型共享一个存储位置。