Поделиться через


Нестандартное поведение

В следующих разделах представлены некоторые ситуации, когда реализация Visual C++ кода C++ не соответствует стандарту C++. Приведенные ниже номера разделов соответствуют номерам разделов в стандарте C++ 11 (ISO/IEC 14882:2011(E)).

Список ограничений компилятора, отличающихся от указанных в стандарте C++, приведен в разделе Ограничения компилятора.

Ковариантные возвращаемые типы

Виртуальные базовые классы не поддерживаются в качестве ковариантных возвращаемых типов, если виртуальная функция имеет виртуальное число аргументов. Это не соответствует пункту 7 раздела 10.3 спецификации C++ ISO. Следующий пример не компилируется, выдается ошибка компилятора C2688

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

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

Привязка независимых имен в шаблонах

В настоящее время компилятор Visual C++ не поддерживает привязку независимых имен при первоначальном синтаксическом анализе шаблона. Это не соответствует разделу 14.6.3 спецификации C++ ISO. Это может привести к тому, что перегруженные версии, объявленные после шаблона (но до создания его экземпляра), будут видны.

#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 спецификации C++ ISO. Например:

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

Дополнительные сведения о спецификациях исключений см. в разделе Спецификации исключений.

char_traits::eof()

Стандартные состояния C++ char_traits::eof не должны соответствовать допустимому значению char_type. Компилятор Visual C++ принудительно вводит это ограничение для типа char, но не для типа wchar_t. Это не соответствует требованиям в таблице 62 в разделе 12.1.1 спецификации ISO C++. Это демонстрируется в приведенном ниже примере.

#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++ имели уникальные расположения хранения. Однако в Visual C++ C в некоторых случаях типы без данных-членов хранятся в одном расположении совместно с другими типами в течение времени существования объекта.