2014-10-15 2 views
0

반환 유형 const_cast과 약간 혼동 스럽습니까? 각괄호 <> 안에있는 유형이 반환 유형입니까?const_cast가 대괄호 안에 지정된 유형을 반환합니까?

const int i = 5; 
int b = const_cast<int&>(i); 

네는 왜 우리가 어떻게 정수에 저장하는 경우 const_castint& (정수 참조)를 반환?

const int i = 5; 
int & b = const_cast<int&>(i); 

답변

3

는 각 브래킷

그것은 각 괄호 유형의 식으로 계산 내에서 지정된 형식을 반환에 const_cast 않습니다 또는 우리는 코드를 수정해야합니다. 여기에서 중요한 것은 당신이 그 표현 사용하는 방법입니다 :이 경우

const int i = 5; 
int b = const_cast<int&>(i); 

bi 단지 복사본입니다. 캐스트는 필요하지 않습니다. 여기

const int i = 5; 
int & b = const_cast<int&>(i); 

bi을 말한다. i의 값을 수정하는 데 사용하면 정의되지 않은 동작입니다.

+0

는 U하셨습니까 이 잘 작동하지만 이것은, I는 INT _tmain 미정 behavioru 얻을 didnt한다 (INT는 argc, _TCHAR *는 argv []) { CONST 제가 에게 = 5에서 INT; int & b = const_cast (i); b ++; return 0; } – Maddyfire

+0

@Maddyfire : 네, UB를 얻고 있습니다. 그것이 UB와 관련된 것입니다. – rodrigo

+0

@Maddyfire 정의되지 않은 동작입니다. 프로그램이 어떤 특별한 결과를 가져올 것이라고 기대할 수는 없습니다. 원하는대로 할 수 있습니다. – juanchopanza

3

예. 그러나 대신을 반환하는 경우 결과 식 의 형식이 인 경우 <>의 형식이됩니다.

const_cast<int&>에서와 같이 해당 유형이 참조 인 경우 해당 값이 l 값임을 나타냅니다. 첫 번째 경우에는 차이가 없습니다. 어쨌든 즉시 r 값으로 변환됩니다. 그런데, 이러한 r 값의 const 때문에 무시된다 차이가 두 번째 경우

int b = const_cast<int&>(i); //ok 
int b = const_cast<int>(i); //also ok 
int b = i; //hey! also ok 

, R 치화에는 L 값이 없으므로 :

int &b = const_cast<int&>(i); //ok 
int &b = const_cast<int>(i); //error: cannot bind a reference to an r-value 
int &b = i; //error: cannot bind a `int&` to a `const int&` 
0

각괄호 <>이 반환 유형입니까?

예. 반환 유형 const_cast<int&>(i)int&입니다. 그런 다음 int에 할당하면 값이 복사됩니다.

그리고 int & b = const_cast<int&>(i);int&에 할당하면 bi을 나타냅니다. b의 수정으로 인해 undifined behaviour이 발생합니다.

관련 문제