2012-04-30 1 views
2

가능한 중복 :는 설명 : 변환 '문자를 **'에 'const를 문자 **', 변환이 손실 예선

void foo(const char ** buffer); 

void bar() 
{ 
    char * buffer; 
    foo(&buffer); 
} 
다음 코드를 감안할 때

Implicit cast from char** to const char**

foo() 함수에 const char * 매개 변수가있는 경우 컴파일러 d 변수 char *을 전달할 때 불평하지 않습니까? 그러나 char **을 사용할 경우 const char **으로 변환 할 수 없습니까? 컴파일러에서 이전 경우에 const 한정자를 추가합니까?

C++ 표준의 4.4 절을 읽고 나 혼란에 빠졌습니다.

답변

3

예, 컴파일러에서 constity가 위반되지 않는다고 보장 할 수 없으므로 T **에서 const T **으로 암시 적으로 변환 할 수 없습니다. 컴파일러 허용 라인 (3), 다음 라인 5는 const 객체에 쓰기 끝낼 것이다 경우

const char c = 'x'; 
char *p1; 
const char **p2 = &p1; // 3 
*p2 = &c; 
*p1 = 'X';    // 5 

:

는 (: Why can't I pass a char ** to a function which expects a const char **? 정확하게이 주제에 대한 C 자주 묻는 질문 질문에서 차용) 다음과 같은 코드를 생각해 보자.

+1

위의 코드를 올바르게 컴파일하려면 어떻게해야합니까? – MarkP

2

고려 :

char const someText[] = "abcd"; 

void 
foo(char const** buffer) 
{ 
    *buffer = someText; 
} 

void 
bar() 
{ 
    char* buffer; 
    foo(&buffer); 
    *buffer = 'x'; 
} 

이 합법적이라면,이 const_cast 개입없이 CONST 객체 를 수정할 수있을 것이다. 이 변환은 상속을 위반하기 때문에 금지되어 있습니다 ( ).

1

const가 적용되는 간접적 인 수준을 혼동시킬 수 있습니다. const char**pointer to a pointer to a constant character로서 설명 될 수있는 반면

char**pointer to a pointer to a character는 것으로 설명 할 수있다. 우리가 다른이를 쓸 때

그래서, 우리는 pointer to A (A = pointer to character)를 가지고 우리는 pointer to B (B = pointer to a constant character)가 있습니다.

A와 B는 A에 대한 포인터를 B에 대한 포인터에 할당 할 수 없으므로 A와 B는 고유 한 유형입니다 (반대의 경우도 마찬가지 임).