2010-08-09 8 views
5

별 앞에 C++에서 수식자인 const은 포인터가 가리키는 값을 변경할 수 없다는 것을 의미하며 포인터 자체는 다른 것을 가리 키도록 만들 수 있습니다. 펑션합니다 (CONST는 제 스타 후 아니므)는 INT * 값을 수정할 수 있지만, 통과 PARAM 가리키는 정수 값 (있는 경우)을 수정하도록 허용되어서는 안된다 const 포인터가 아닌 const 포인터 double 포인터 매개 변수

void justloadme(const int **ptr) 
{ 
    *ptr = new int[5]; 
} 

int main() 
{ 
    int *ptr = NULL; 
    justloadme(&ptr); 
} 

justloadme

이하 ,하지만 여전히 GCC와 VC++ 모두에서 컴파일러 오류가 발생하는 이유는 무엇입니까?

GCC : 오류 : 유효하지 않은 변환 int**에서

VC++를 const int**에 : 오류 C2664 : 'justloadme': 변환 할 수 없습니다 매개 변수 1 'INT **'에서 'const를 INT **'이다. 변환에서 한정자가 없어짐

변환이 한정자를 잃는 이유는 무엇입니까? const 한정자를 얻지 못했습니까? 게다가, 우리가 non-const를 전달하는 strlen(const char*)과 비슷하지 않습니다. char*

+4

이 기분 http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 – Anycorn

답변

8

대부분의 경우 컴파일러는 정확하고 직관이 잘못되었습니다.

const int constant = 10; 
int *modifier = 0; 
const int ** const_breaker = &modifier; // [*] this is equivalent to your code 

*const_breaker = & constant; // no problem, const_breaker points to 
           // pointer to a constant integer, but... 
           // we are actually doing: modifer = &constant!!! 
*modifier = 5;     // ouch!! we are modifying a constant!!! 

라인은 [*] 그 위반의 범인으로 표시하고, 특정 이유로 허용되지 않습니다 : 문제는 특정 할당이 허용 된 경우 프로그램에서 const를-정확성을 깰 수 있다는 것입니다. 언어는 마지막 단계로 const를 추가하지만 첫 번째되지 허용 :

int * const * correct = &modifier; // ok, this does not break correctness of the code 
+0

이지만 컴파일러가이'const'를 수정하는 것을 막기 위해서입니다. 그러나'int * const * correct'를 사용하면'ptr = new int [5];를 할 수 없습니다. 나는 무엇을해야합니까? – legends2k

+1

문제는 당신이하고 싶은 것이 당신이 쓴 글이 아니라는 것입니다. 당신이하고 싶은 것은 무엇입니까? 서명은'const int **'를 취하지 만'int ** '를 전달하고 함수 내부에서 그것을'int **'로 취급합니다 ... 당신은 정말로 그 서명에'const'를 원합니까? –

+1

오, 이제 알 겠어! 제가하려는 것은 개념 상 잘못입니다. 그렇습니다. 당신 말이 맞습니다. 감사! – legends2k

관련 문제