비표준 동작

다음 섹션에서는 Microsoft C++ 구현이 C++ 표준을 준수하지 않는 일부 위치를 나열합니다. 아래에 제공된 섹션 번호는 C++11 표준(ISO/IEC 14882:2011(E))의 섹션 번호를 참조합니다.

C++ 표준에 정의된 것과 다른 컴파일러 제한 목록은 컴파일러 제한에 제공됩니다.

공변 반환 형식

가상 함수에 개수가 가변적인 인수가 있을 때 가상 기본 클래스는 공변(covariant) 반환 형식으로 지원되지 않습니다. 이는 C++11 ISO 사양의 섹션 10.3, 단락 7을 따르지 않습니다. 다음 샘플은 컴파일되지 않습니다. 컴파일러 오류 C2688을 생성합니다.

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

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

템플릿에서 독립적인 이름 바인딩

Microsoft C++ 컴파일러는 템플릿을 처음 구문 분석할 때 현재 종속되지 않는 이름 바인딩을 지원하지 않습니다. 이는 C++11 ISO 사양의 섹션 14.6.3을 따르지 않습니다. 이로 인해 템플릿이 확인되고 인스턴스화되기 전에 오버로드가 선언될 수 있습니다.

#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() 이외의 함수 예외 지정자는 구문 분석되지만 사용되지 않습니다. ISO C++11 사양의 섹션 15.4를 따르지 않습니다. 예시:

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++ 컴파일러는 형식에 대해 이 제약 조건을 적용하지만 형식charwchar_t에는 적용되지 않습니다. 이는 C++11 ISO 사양의 12.1.1 섹션에 있는 표 62의 요구 사항을 준수하지 않습니다. 아래 예제에서는 이 동작을 보여 줍니다.

#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++에서는 데이터 멤버가 없는 형식이 개체의 수명 동안 다른 형식과 스토리지 위치를 공유하는 경우가 있습니다.