Udostępnij za pośrednictwem


Niestandardowe zachowanie

Poniższa sekcja wymienia niektóre z miejsc, w których implementacja C++ w języku Visual C++ jest niezgodna ze standardem C++.Numery sekcji podane poniżej odnoszą się do numerów sekcji w standardzie C++11 (ISO/IEC 14882:2011(E)).

Wykaz limitów kompilatora, które różnią się od tych zdefiniowanych w standardzie C++, jest podany w dokumencie Limity kompilatora.

Kowariantne typy zwracane

Wirtualne klasy podstawowe nie są obsługiwane jako kowariantne typy zwracane, gdy funkcja wirtualna ma zmienną liczbę argumentów.Jest to niezgodne z sekcją 10.3.7 specyfikacji ISO C++.Poniższy przykłady nie kompiluje się, dając 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 Visual C++ nie obsługuje obecnie wiązania nazw niezależnych podczas początkowego analizowania składni szablonu.Jest to niezgodne z sekcją 14.6.3 specyfikacji ISO C++.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ątku w funkcji inne niż throw() są analizowane, lecz nie są wykorzystywane.Jest to niezgodne z sekcją 15.4 specyfikacji ISO C++.Na przykład:

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

Aby uzyskać więcej informacji dotyczących specyfikacji wyjątków, zobacz Specyfikacje wyjątków.

char_traits::eof()

Standard C++ stanowi, że char_traits::eof nie może odpowiadać ważnej wartości char_type.Kompilator języka Visual C++ wymusza to ograniczenie dla typu char, ale nie dla typu wchar_t.Jest to niezgodne z wymogami określonymi w tabeli 62 w sekcji 12.1.1 specyfikacji ISO C++.Prezentuje to poniższy przykład.

#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 Visual C++ istnieją przypadki, w których typy bez elementów członkowskich danych będą współdzieliły lokalizację przechowywania z innymi typami przez okres istnienia obiektu.