Comportamento não padrão
As seções a seguir listam alguns dos locais em que a implementação da Microsoft do C++ não está em conformidade com o padrão C++. Os números de seção fornecidos abaixo referem-se aos números de seção no padrão C++11 (ISO/IEC 14882:2011(E)).
A lista de limites do compilador que diferem daqueles definidos no padrão C++ é fornecida em Limites do compilador.
Tipos de retorno covariantes
As classes base virtuais não têm suporte como tipo de retorno covariante quando a função virtual tem um número variável de argumentos. Isso não está em conformidade com a seção 10.3, parágrafo 7 da especificação ISO C++11. O seguinte exemplo não é compilado; gera o erro do compilador C2688:
// CovariantReturn.cpp
class A
{
virtual A* f(int c, ...); // remove ...
};
class B : virtual A
{
B* f(int c, ...); // C2688 remove ...
};
Associação de nomes não dependentes nos modelos
O compilador Microsoft C++, atualmente, não dá suporte à associação de nomes não dependentes ao analisar inicialmente um modelo. Isso não está em conformidade com a seção 14.6.3 da especificação ISO C++11. Isso pode fazer com que sobrecargas declaradas após o modelo (mas antes do modelo ser instanciado) sejam vistas.
#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 exceção de função
Os especificadores da exceção de função diferentes de throw()
são analisados, mas não usados. Isso não está em conformidade com a seção 15.4 da especificação ISO C++11. Por exemplo:
void f() throw(int); // parsed but not used
void g() throw(); // parsed and used
Para obter mais informações sobre as especificações de exceção, confira Especificações de exceção.
char_traits::eof()
O padrão C++ declara que char_traits::eof não deve corresponder a um valor char_type
válido. O compilador Microsoft C++ impõe essa restrição para o tipo char
, mas não para o tipo wchar_t
. Isso não está em conformidade com o requisito da Tabela 62 na seção 12.1.1 da especificação ISO C++11. O exemplo abaixo demonstra esse 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;
}
Local de armazenamento de objetos
O padrão C++ (seção 1.8, parágrafo 6) exige que objetos completos do C++ tenham locais exclusivos de armazenamento. No entanto, com o Microsoft C++, há casos em que tipos sem membros de dados compartilharão um local de armazenamento com outros tipos pelo tempo de vida do objeto.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de