FDIS에는 부록 C.2
"C ++ 및 ISO C ++ 2003" 에 비 호환성 섹션이 있습니다.
여기에서 FDIS를 해석하여 SO 답변으로 적합하게 만드는 요약. 차이점을 설명하기 위해 내 예제를 추가했습니다.
라이브러리의 비 호환성이 몇 가지 있지만 그 의미를 정확히 알지 못하므로 다른 사람들이 자세히 설명 할 수 있습니다.
핵심 언어
#define u8 "abc"
const char *s = u8"def"; // Previously "abcdef", now "def"
#define _x "there"
"hello"_x // now a user-defined-string-literal. Previously, expanded _x .
새 키워드 : alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert 및 thread_local
long으로 표현할 수있는 것보다 큰 특정 정수 리터럴은 부호없는 정수 유형에서 부호있는 long long으로 변경 될 수 있습니다.
정수 나누기를 사용하는 유효한 C ++ 2003 코드는 결과를 0 또는 음의 무한대로 반올림하지만 C ++ 0x는 항상 결과를 0으로 반올림합니다.
(실제로 대부분의 사람들에게 호환성 문제는 아닙니다).
키워드 auto
를 스토리지 클래스 지정자로 사용하는 유효한 C ++ 2003 코드 는 C ++ 0x에서 유효하지 않을 수 있습니다.
변환이 좁아지면 C ++ 03과 호환되지 않습니다. 예를 들어 다음 코드는 C ++ 2003에서는 유효하지만 double to int는 축소 변환이므로이 국제 표준에서는 유효하지 않습니다.
int x[] = { 2.0 };
암시 적으로 선언 된 특수 멤버 함수는 암시 적 정의의 형식이 잘못되었을 때 삭제 된 것으로 정의됩니다.
정의가 필요하지 않은 상황 (예 : 잠재적으로 평가되지 않은 설명)에서 이러한 특수 멤버 함수 중 하나를 사용하는 유효한 C ++ 2003 프로그램은 잘못 구성됩니다.
나에 의한 예 :
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
이러한 크기의 트릭은 일부 SFINAE에서 사용되었으며 지금 변경해야합니다. :)
사용자 선언 소멸자는 암시 적 예외 사양이 있습니다.
나에 의한 예 :
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
이 코드는 terminate
C ++ 0x에서 호출 하지만 C ++ 03에서는 호출 되지 않습니다. A::~A
C ++ 0x에서 의 암시 적 예외 사양은 입니다 noexcept(true)
.
포함 된 유효한 C ++ 2003 선언 export
은 C ++ 0x에서 잘못 구성되었습니다.
유효한 C ++ 2003 표현식 >
뒤에 바로 다른 표현식이 포함 되어 >
이제는 두 개의 템플리트를 닫는 것으로 간주 될 수 있습니다.
C ++ 03에서는 >>
항상 shift-operator 토큰이됩니다.
내부 연결로 함수의 종속 호출을 허용합니다.
나에 의한 예 :
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
C ++ 03에서는을 호출 f(long)
하지만 C ++ 0x에서는을 호출합니다 f(int)
. C ++ 03 및 C ++ 0x에서 다음 호출이 있습니다 f(B)
(인스턴스화 컨텍스트는 여전히 extern linkage 선언 만 고려합니다).
struct B { };
struct A : B { };
template<typename T>
void g(T t) { f(t); }
static void f(A) { }
void f(B) { }
int main() { A a; g(a); }
f(A)
외부 연결이 없기 때문에 더 나은 일치 가 이루어지지 않습니다.
라이브러리 변경
C ++ 0x의 C ++ 표준 라이브러리에 추가 된 식별자를 사용하는 유효한 C ++ 2003 코드는이 국제 표준에서 컴파일 또는 다른 결과를 생성하지 못할 수 있습니다.
#includes
새로운 C ++ 0x 표준 라이브러리 헤더의 이름을 가진 헤더가이 국제 표준에서 유효하지 않은 유효한 C ++ 2003 코드 .
스왑이있을 것으로 예상되어 컴파일 된 유효한 C ++ 2003 코드는 <algorithm>
다음을 포함해야합니다.<utility>
글로벌 네임 스페이스 posix
는 이제 표준화를 위해 예약되어 있습니다.
유효한 C ++가 정의하는 것이 2003 코드 override
, final
, carries_dependency
, 또는 noreturn
매크로와 같은 C ++ 0X에 유효하지 않습니다.
export
키워드 의 의미를 제거 하시겠습니까? 코트 입을 게요