Nestandardní chování

Následující části uvádějí některá místa, kde implementace jazyka C++ společnosti Microsoft nevyhovuje standardu C++. Čísla oddílů uvedená níže odkazují na čísla oddílů ve standardu C++11 (ISO/IEC 14882:2011(E)).

Seznam omezení kompilátoru, které se liší od omezení definovaných v standardu C++, je uveden v omezeních kompilátoru.

Kovariantní návratové typy

Virtuální základní třídy nejsou podporovány jako kovariantní návratové typy, pokud virtuální funkce má proměnný počet argumentů. To neodpovídá bodě 10.3 odstavce 7 specifikace ISO C++11. Následující ukázka se nekompiluje; generuje chybu kompilátoru C2688:

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

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

Názvy nezávislé vazby v šablonách

Kompilátor Jazyka Microsoft C++ v současné době nepodporuje vazby nesouvisených názvů při počáteční analýze šablony. To neodpovídá části 14.6.3 specifikace ISO C++11. To může způsobit přetížení deklarované poté, co má být šablona (ale předtím, než je vytvořena instance šablony) zobrazena.

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

Specifikátory výjimek funkcí

Specifikátory výjimek funkce, které throw() nejsou analyzovány, ale nepoužívají se. To neodpovídá části 15.4 specifikace ISO C++11. Příklad:

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

Další informace o specifikacích výjimek naleznete v tématu Specifikace výjimek.

char_traits::eof()

Standardní jazyk C++ uvádí, že char_traits::eof nesmí odpovídat platné char_type hodnotě. Kompilátor jazyka Microsoft C++ vynucuje toto omezení pro typ char, ale ne pro typ wchar_t. Nevyhovuje požadavkům v tabulce 62 v části 12.1.1 specifikace ISO C++11. Následující příklad ukazuje toto chování.

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

Umístění úložiště objektů

Standard C++ (odstavec 6 oddílu 1.8) vyžaduje jedinečná umístění úložiště objektů jazyka C++. U Microsoft C++ však existují případy, kdy typy bez datových členů budou sdílet umístění úložiště s jinými typy po celou dobu životnosti objektu.