Comportamiento no estándar

En las secciones siguientes se enumeran algunos de los lugares en los que la implementación de Microsoft de C++ no se ajusta al estándar de C++. Los números de sección indicados a continuación hacen referencia a los números de sección del estándar C++11 (ISO/IEC 14882:2011(E)).

La lista de límites del compilador que difieren de los definidos en el estándar de C++ se proporciona en Límites del compilador.

Tipos de valor devueltos de covariante

Las clases base virtuales no se admiten como tipos de valor devueltos de covariante cuando la función virtual tiene un número variable de argumentos. Esto no se ajusta a la sección 10.3, párrafo 7 de la especificación ISO de C++11. El ejemplo siguiente no se compila; genera el error del compilador C2688:

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

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

Enlazar nombres no dependientes en plantillas

En estos momentos, el compilador de Microsoft C++ no admite nombres no dependientes al analizar una plantilla inicialmente. Esto no se ajusta a la sección 14.6.3 de la especificación ISO de C++11. Esto puede hacer que se vean las sobrecargas declaradas después de la plantilla (pero antes de que se creen instancias de la plantilla).

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

Especificadores de excepciones de funciones

Los especificadores de excepciones de funciones distintos de throw() se analizan pero no se usan. Esto no se ajusta a la sección 15.4 de la especificación ISO C++11. Por ejemplo:

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

Para obtener más información sobre las especificaciones de excepciones, vea Especificaciones de excepciones.

char_traits::eof()

El estándar de C++ indica que char_traits::eof no debe corresponder a un valor char_type válido. El compilador de Microsoft C++ exige esta restricción para el tipo char, pero no para el tipo wchar_t. Esto no se ajusta al requisito de la tabla 62 de la sección 12.1.1 de la especificación ISO de C++11. En el ejemplo siguiente se muestra este comportamiento.

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

Ubicación de almacenamiento de objetos

El estándar de C++ (sección 1.8, párrafo 6) requiere que los objetos de C++ completos tengan ubicaciones de almacenamiento únicas. Sin embargo, con Microsoft C++ hay casos en los que tipos sin miembros de datos compartirán una ubicación de almacenamiento con otros tipos mientras dure el objeto.