2016-08-19 6 views
1
#include <iostream> 
int foo(const char* keke) { 
    std::cout << keke; 
    return 0; 
} 
int main() 
{ 
    char* keke = new char(10); 
    char* const haha = keke; 
    return foo(haha); 
} 

위의 코드를 컴파일하는 동안 오류/경고가 표시되지 않는 이유는 무엇입니까?C++의 constness와 관련된 암시 적 변환

haha의 유형은 char* const이고 fooconst char* 유형의 인수 만 수신합니다. char* const 암시 적으로 변환 될 수 const char*?

+0

나는 암묵적인 변환에 대해 묻고 있기 때문에 질문을 다시 열었습니다. 차이는 아닙니다. – songyuanyao

답변

4

예. 그것은라고 qualification conversions (암시 적 변환 중 하나) :

(강조 광산)

이력서 자격을 갖춘 타입 T에 대한 타입 포인터의 prvalue는 더 이력서 자격에 prvalue 포인터로 변환 할 수 있습니다

동일한 유형 T (즉, constness 및 변동성을 추가 할 수 있음).

는 "더보기"CV 수식은

비정규 형 포인터가 CONST 포인터로 변환 될 수 있다는 것을 의미한다;
은 ...

char* 암시 const char*로 변환 할 수있는 것을 의미한다. 포인터 자체에

const 규정은 문제가되지 여기, 그 자체가 선언 된 매개 변수 keke이 값에 의해 전달 될 않습니다, 그것은 haha에서 복사되는 인수 (; char* constconst 포인터) 괜찮아요.

+0

함수 호출에 관련된 암시 적 변환이 있습니까?'passed by value' ... – Jichao

+0

@ Jichao 당신은'char * const'에서'char *'까지를 의미합니까? No. – songyuanyao

+0

함수 호출에서,'char * const'와'char *'에 타입 매치를 할 필요가 없다? – Jichao