2011-04-07 6 views
3
GCC 컴파일러는이 코드에 대한 오류를 제공
#include <iostream> 

void f(const int * & p) 
{ 
    int i =0; 
    i = p[0]; 
    std::cout << i << std::endl; 
} 

int main() 
{ 
    int * p =new int[1]; 
    p[0] =102; 
    f(p); 
    return 1; 
} 

:CONST 매개 변수 문제

prog.cpp: In function ‘int main()’: 
prog.cpp:16: error: invalid initialization of reference of type ‘const int*&’ from expression of type ‘int*’ 
prog.cpp:5: error: in passing argument 1 of ‘void f(const int*&)’ 

하지만

void f(const int * const & p) 

모두에 "F"기능을 변경하면 괜찮습니다. 누군가 const가 왜 이런 식으로 행동하는지 설명 할 수 있습니까? 감사.

+1

안녕. 이 경우 항상 표시되는 오류 메시지를 게시하는 것이 좋습니다. 제발 그렇게 할 수 있니? – razlebe

+1

http://duramecho.com/ComputerInformation/WhyHowCppConst.html 왜이 오류가 발생하는지이 참조를 확인하십시오. –

+0

gcc4.3.4에 의해 생성 된 오류 메시지를 추가했습니다. – razlebe

답변

10

int*에서 const int*으로 이동하려면 임시 const int* 포인터를 생성하고 참조 번호 const int*&을 임시로 바인딩해야합니다.

표준은 비 const 참조를 위해 임시로 만드는 것을 금지합니다. 그 때문에 수정 한 것처럼 참조를 const로 만들어야합니다.

이것은 const가 아닌 참조는 "호출자가 참조 매개 변수를 사용하여 전달하는 인수를 변경하려고합니다"를 의미하기 때문입니다. 그러나 호출자가 인수를 변환하여 일시적으로 끝나는 경우 참조의 요지는 아무 것도없는 것이므로 표준에서 임시로 전달하려고 시도하는 것이 오류라고 간주합니다.

1

최초의 변환 (int *const int * &에) 허용 한 경우이 같은 악한 기능을 쓸 수 있습니다 :

const int really_const[] = {1,2,3}; 

void evil(const int * & p) 
{ 
    p = really_const; 
} 

int main() 
{ 
    int not_const[3]; 
    int * p = not_const; 
    evil(p); 
    p[0] = 0; // Whoops: modifying a const object 
} 

는이에 포인터를 수정하는 기능을 방지하기 때문에 두 번째 변환, 괜찮를 방법.

+0

'const int *'를 통해 변환하도록 정의되지 않은 경우,'p = really_const'는'main'의'p' 변수가 아닌 임시 변수를 수정합니다. 그러면 '악마'는 즉각적으로 파괴 된 임시 정보를 수정하고 사용자가 변경 사항이 어디로 갔는지 궁금해하기 때문에 '혼란 스럽다'는 제목이 붙을 것입니다. –