Condividi tramite


Comportamento non standard

Negli sezioni seguenti sono elencate alcune parti in cui l'implementazione Visual C++ di C++ non si conforma allo standard C++. I numeri delle sezioni indicati di seguito fanno riferimento ai numeri delle sezioni nello standard C++ 11 (ISO/IEC 14882:2011(E)).

L'elenco dei limiti del compilatore che differiscono da quelli definiti nello standard C++ viene fornito in Limite 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 C++ ISO. Nell'esempio seguente la compilazione non viene eseguita con il seguente 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 Visual C++ non supporta attualmente i nomi di associazione non dipendenti nell'analisi iniziale di un modello. Questo non è conforme alla sezione 16.6.3 della specifica C++ ISO. 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++. Di seguito è riportato un esempio.

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

Per ulteriori informazioni sulle specifiche di eccezione, vedere Specifiche di eccezione.

char_traits::eof()

Gli stati standard C++ che char_traits::eof non devono corrispondere a un valore char_type valido. Il compilatore di Visual C++ applica questo vincolo al tipo char, ma non al tipo wchar_t. Questo non è conforme al requisito indicato nella Tabella 62 della sezione 12.1.1 della specifica ISO C++. Nell'esempio che segue viene illustrato quanto descritto.

#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 Visual C++, vi sono casi in cui tipi senza membri dati condividono una posizione di archiviazione con altri tipi per la durata dell'oggetto.