Comportamento non standard

Le sezioni seguenti elencano alcune delle posizioni in cui l'implementazione Microsoft di C++ non è conforme allo standard C++. I numeri di sezione indicati di seguito fanno riferimento ai numeri di sezione dello standard C++11 (ISO/IEC 14882:2011(E)).

L'elenco dei limiti del compilatore diversi da quelli definiti nello standard C++ è indicato in Limiti del compilatore.

Tipi restituiti covarianti

Le classi base virtuali non sono supportate come tipi restituiti covarianti quando la funzione virtuale dispone di un numero variabile di argomenti. Questo non è conforme alla sezione 10.3, paragrafo 7 della specifica ISO C++11. L'esempio seguente non viene compilato; genera l'errore del compilatore C2688:

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

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

Associazione di nomi non dipendenti nei modelli

Il compilatore Microsoft C++ attualmente non supporta l'associazione di nomi non indipendenti durante l'analisi iniziale di un modello. Questo non è conforme alla sezione 14.6.3 della specifica ISO C++11. Ne possono conseguire overload dichiarati dopo il modello, ma prima della creazione di istanze del modello stesso.

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

Identificatori di eccezioni di funzione.

Gli identificatori di eccezioni di funzione diversi da throw() vengono analizzati, ma non utilizzati. Questo non è conforme alla sezione 15.4 della specifica ISO C++11. Ad esempio:

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

Per altre informazioni sulle specifiche delle eccezioni, vedere Specifiche delle eccezioni.

char_traits::eof()

Lo standard C++ indica che char_traits::eof non deve corrispondere a un valore valido char_type . Il compilatore Microsoft C++ applica questo vincolo per il tipo char, ma non per il tipo wchar_t. Questo non è conforme ai requisiti della tabella 62 nella sezione 12.1.1 della specifica ISO C++11. L'esempio seguente illustra questo comportamento.

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

Percorso di archiviazione di oggetti

Lo standard C++ (sezione 1.8 paragrafo 6) richiede che oggetti C++ completi abbiano percorsi di archiviazione univoci. Tuttavia, con Microsoft C++, esistono casi in cui i tipi senza membri dati condivideranno una posizione di archiviazione con altri tipi per la durata dell'oggetto.