Niestandardowe zachowanie
W poniższych sekcjach wymieniono niektóre miejsca, w których implementacja języka C++ przez firmę Microsoft nie jest zgodna ze standardem C++. Numery sekcji podane poniżej odnoszą się do numerów sekcji w standardzie C++11 (ISO/IEC 14882:2011(E)).
Lista limitów kompilatora, które różnią się od tych zdefiniowanych w standardzie języka C++, jest podana w temacie Limity kompilatora.
Kowariantne typy zwracane
Wirtualne klasy bazowe nie są obsługiwane jako kowariantne typy zwracane, gdy funkcja wirtualna ma zmienną liczbę argumentów. Nie jest to zgodne z sekcją 10.3 pkt 7 specyfikacji ISO języka C++11. Poniższy przykład nie jest kompilowany; generuje błąd kompilatora C2688:
// CovariantReturn.cpp
class A
{
virtual A* f(int c, ...); // remove ...
};
class B : virtual A
{
B* f(int c, ...); // C2688 remove ...
};
Powiązanie nazw niezależnych w szablonach
Kompilator języka Microsoft C++ nie obsługuje obecnie powiązania nazw niezależnych podczas początkowego analizowania szablonu. Nie jest to zgodne z sekcją 14.6.3 specyfikacji ISO języka C++11. Może to powodować wystąpienie przeciążeń zadeklarowanych po szablonie (ale przed wystąpieniem szablonu).
#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)
Specyfikatory wyjątku w funkcji.
Specyfikatory wyjątków funkcji inne niż throw()
są analizowane, ale nie są używane. Nie jest to zgodne z sekcją 15.4 specyfikacji ISO C++11. Na przykład:
void f() throw(int); // parsed but not used
void g() throw(); // parsed and used
Aby uzyskać więcej informacji na temat specyfikacji wyjątków, zobacz Specyfikacje wyjątków.
char_traits::eof()
Standard C++ stwierdza, że char_traits::eof nie może odpowiadać prawidłowej char_type
wartości. Kompilator języka Microsoft C++ wymusza to ograniczenie dla typu char
, ale nie dla typu wchar_t
. Nie jest to zgodne z wymaganiami w tabeli 62 w sekcji 12.1.1 specyfikacji ISO języka C++11. W poniższym przykładzie pokazano to zachowanie.
#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;
}
Lokalizacja przechowywania obiektów
Standard C++ (sekcja 1.8.6) wymaga, aby kompletne obiekty C++ miały unikatową lokalizację przechowywania. Jednak w przypadku języka Microsoft C++istnieją przypadki, w których typy bez elementów członkowskich danych będą współdzielić lokalizację magazynu z innymi typami przez okres istnienia obiektu.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla