Nestandardní chování
V následujících oddílech jsou uvedeny některé z míst, kde implementace Visual C++ jazyka C++ nesplňuje standard C++.Čísla oddílů, která jsou uvedena níže, odkazují na čísla oddílů ve standardu C++ (ISO/IEC 14882:2011(E)).
Seznam omezení kompilátoru, která se liší od podmínek stanovených ve standardu C++, je uveden v tématu Omezení 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 není v souladu s oddílem 10.3, odstavcem 7 specifikace C++ ISO.Následující ukázka nezkompiluje, hlásí 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 Visual C++ aktuálně nepodporuje názvy nezávislé vazby při počáteční analýze šablony.To není v souladu s oddílem 14.6.3 specifikace C++ ISO.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 funkcí, kromě throw(), jsou analyzovány, ale nejsou použity.To není v souladu s oddílem 15.4 specifikace ISO C++.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()
Standard C++ uvádí, že char_traits::eof nesmí odpovídat platné hodnotě char_type.Kompilátor Visual C++ vynucuje toto omezení pro typ char, ale ne pro typ wchar_t.To není v souladu s požadavky tabulky 62 v oddíle 12.1.1 specifikace C++ ISO.To zachycuje níže uvedený příklad.
#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++.V jazyce Visual C++ však existují případy, kde typy bez datových členů budou sdílet umístění úložiště s jinými typy po dobu životnosti objektu.