Nicht dem Standard entsprechendes Verhalten

In den folgenden Abschnitten werden einige der Stellen aufgeführt, an denen die Microsoft-Implementierung von C++ nicht dem C++-Standard entspricht. Die unten angegebenen Abschnittsnummern beziehen sich auf die Abschnittsnummern im C++11-Standard (ISO/IEC 14882:2011(E)).

Die Liste der Compilergrenzwerte, die sich von denen unterscheiden, die im C++-Standard definiert sind, wird in Compilergrenzwerten angegeben.

Kovariante Rückgabetypen

Virtuelle Basisklassen werden nicht als kovariante Rückgabetypen unterstützt, wenn die virtuelle Funktion eine variable Anzahl von Argumenten hat. Dies entspricht nicht Abschnitt 10.3, Absatz 7 der C++11 ISO-Spezifikation. Das folgende Beispiel wird nicht kompiliert. es generiert Compilerfehler C2688:

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

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

Bindung von nicht abhängigen Namen in Vorlagen

Der Microsoft C++-Compiler unterstützt derzeit keine bindungsfreien Namen beim anfänglichen Analysieren einer Vorlage. Dies entspricht nicht Abschnitt 14.6.3 der C++11 ISO-Spezifikation. Das kann zu Überladungen führen, die deklariert werden, nachdem die Vorlage (aber bevor die Vorlage instanziiert wird) angezeigt werden kann.

#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)

Funktionsausnahmebezeichner

Funktionsausnahmebezeichner mit Ausnahme von throw() werden analysiert, aber nicht verwendet. Dies entspricht nicht Abschnitt 15.4 der ISO C++11-Spezifikation. Beispiel:

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

Weitere Informationen zu Ausnahmespezifikationen finden Sie unter "Ausnahmespezifikationen".

char_traits::eof()

Der C++-Standard gibt an, dass char_traits::eof keinem gültigen char_type Wert entsprechen darf. Der Microsoft C++-Compiler erzwingt diese Einschränkung für den Typ char, jedoch nicht für den Typ wchar_t. Dies entspricht nicht der Anforderung in Tabelle 62 in Abschnitt 12.1.1 der C++11 ISO-Spezifikation. Im folgenden Beispiel wird dieses Verhalten veranschaulicht.

#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;
}

Speicherort für Objekte

Der C++-Standard (Abschnitt 1,8, Absatz 6) erfordert vollständige C++-Objekte, um eindeutige Speicherpositionen zu haben. Bei Microsoft C++ gibt es jedoch Fälle, in denen Typen ohne Datenmember einen Speicherort für andere Typen für die Lebensdauer des Objekts freigeben.