비표준 동작
다음 섹션에서는 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++ 컴파일러는 형식에 대해 이 제약 조건을 적용하지만 형식char
wchar_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++에서는 데이터 멤버가 없는 형식이 개체의 수명 동안 다른 형식과 스토리지 위치를 공유하는 경우가 있습니다.
피드백
https://aka.ms/ContentUserFeedback을 참조하세요.
출시 예정: 2024년 내내 콘텐츠 피드백 메커니즘인 GitHub 문제를 단계적으로 폐지하고 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은다음에 대한 사용자 의견 제출 및 보기