Нестандартное поведение
В следующих разделах перечислены некоторые места, где реализация Microsoft C++ не соответствует стандарту C++. Номера разделов, указанные ниже, относятся к номерам разделов в стандарте C++11 (ISO/IEC 14882:2011(E)).
Список ограничений компилятора, которые отличаются от ограничений компилятора, определенных в стандарте C++, приведены в ограничениях компилятора.
Ковариантные возвращаемые типы
Виртуальные базовые классы не поддерживаются в качестве ковариантных возвращаемых типов, если виртуальная функция имеет виртуальное число аргументов. Это не соответствует разделу 10.3, абзац 7 спецификации ISO C++11. Следующий пример не компилируется; он создает ошибку компилятора C2688:
// CovariantReturn.cpp
class A
{
virtual A* f(int c, ...); // remove ...
};
class B : virtual A
{
B* f(int c, ...); // C2688 remove ...
};
Привязка независимых имен в шаблонах
Компилятор Microsoft C++ в настоящее время не поддерживает независимые имена привязки при первоначальном анализе шаблона. Это не соответствует разделу 14.6.3 спецификации ISO C++11. Это может привести к тому, что перегруженные версии, объявленные после шаблона (но до создания его экземпляра), будут видны.
#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)
Описатели исключений функций
Описатели исключений функции, отличные от throw()
, анализируются, но не используются. Это не соответствует разделу 15.4 спецификации ISO C++11. Например:
void f() throw(int); // parsed but not used
void g() throw(); // parsed and used
Дополнительные сведения о спецификациях исключений см. в разделе "Спецификации исключений".
char_traits::eof()
Стандарт C++ утверждает, что char_traits::eof не должно соответствовать допустимому char_type
значению. Компилятор Microsoft C++ применяет это ограничение для типа, но не для типаchar
wchar_t
. Это не соответствует требованию в таблице 62 в разделе 12.1.1 спецификации ISO C++11. В приведенном ниже примере показано это поведение.
#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;
}
Место хранения объектов
Стандарт языка C++ (раздел 1.8, пункт 6) требует, чтобы полные объекты C++ имели уникальные расположения хранения. Однако в Microsoft C++существуют случаи, когда типы без элементов данных будут совместно использовать расположение хранилища с другими типами для времени существования объекта.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по