2011-01-09 5 views
5

정수 형식을 상위 형식으로 변환하는 구체적인 경우에 대해 C++ 표준 (정수 판촉) 4.5 절에서 설명합니다.C++의 정수 판촉과 정수 변환의 차이점

정수 유형의를 rvalue 다른 정수 유형의를 rvalue로 변환 할 수 있습니다 :

섹션 C++ 표준 (정수 변환)의 4.7 (총알 4.7.1)로 시작합니다. 열거 유형의 rvalue는 정수 유형의 rvalue로 변환 될 수 있습니다.

지금까지 내가 (아마도 총알 4.5.3 (열거 형) 제외) 4.5에 설명 된 변환을 이해 4.7 섹션 만의 기술을 사용하여 수행 할 수 있습니다 : 4.5.1과 4.5.2이 완전히 덮여를 4.7.1 씩; 4.5.4는 4.7.4에서 다룬다. 그렇다면 전체 4.5 섹션의 목적은 무엇입니까? 어떤 추가 전환이 가능합니까? 어쩌면 몇 가지 제한 사항이 누락 되었습니까?

P. C++ 03 표준 버전을 읽고 있습니다.

답변

8

나는 모두 같은 변환 카테고리에 빠지게 다른 순위 (참조 13.3.3.1.1, 표준 변환 시퀀스)이 없기 때문에 구분이 중요하다고 생각 .

표준 변환 시퀀스가 ​​자신의 계급에 의해 정렬 :이 해상도를 오버로드 할 때 순위는 차이가 정확히 일치는 변환보다 더 나은 변환하는 추진, 보다 더 나은 변환입니다. 결국

, 나는 그것이 모호 다음 코드하게 4.5과 4.7의 차이라고 생각 : int

#include <iostream> 

void foo(int i)   { std::cout << "foo(int)" << std::endl; } 
void foo(unsigned short i) { std::cout << "foo(unsigned short)" << std::endl; } 

int main() 
{ 
    foo(static_cast<short>(1)); 
} 
  • short 승진이다 (따라서 가진 승진 순위)
  • short ~ unsigned short은 변환 (따라서 변환 랭크를 가짐)이다. (따라서 변환 랭크를 갖는다)

결국이 코드는 더 좋은 후보이기 때문에 foo(int)을 호출합니다.

4

프로모션은 산술 및 기타 작업 중에 발생합니다. 전환은 하나의 정수 유형을 다른 카테고리에 단순히 저장할 때 발생합니다.

+0

흠. 그래서 만약 내가'unsigned char a; 부호있는 문자 b; ... short c = a + b', 처음에'a'와'b'는 * 승격 * 된 (부호없는) int로 추가되고 그 결과는 * short *로 변환됩니까? –

+0

@ 부 라티 나스, 예. – AProgrammer

+2

@buratinas : a가 unsingned int로 승격되고 b가 signed int로 승격 된 후 b 승격의 결과가 unsigned int로 변환되면 이들이 더해지고 결과는 signed short로 변환됩니다. –