2011-03-23 4 views
3

을에서 const 캐스트 나는 함수로 선언했다 : (VS 2008 익스프레스)C/C++의 불확실성을

float** ppArr = new float*[5]; 
// Some initialization of ppArr 

int result = myFunction(ppArr, 5, 128); <<<< Error 

및 오류는 다음과 같습니다 :

int myFunction(const float** ppArr, const int n, const int m); 

내가 그렇게처럼 호출 할 때

error C2664: 'Test_myFunction.cpp' : cannot convert parameter 1 from 'float **' to 'const float **' 

WTF? 나는 float **을 const **로 캐스팅합니다. 아마도 그걸 잘못 해석 할 수 있을까요? :/

편집 : 엄청나게 빠른 응답에 감사드립니다! :)

답변

2

사실 이상한 것처럼 특정 애매한 경우에 const-correctness를 줄여서 const 개체를 간접적으로 수정할 수 있습니다.

자세한 내용은 http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17을 참조하십시오.

Foo**Foo const* const*으로 변환하면 백도어가 열려 있지 않으므로 변환 할 수 있습니다.

0

float**const float**으로 변환 할 수 없습니다.

float* const*const float* const*으로 변환 할 수 있습니다. 이처럼 :

void f(float* const* p) {} 

void h(const float* const* p) {} 

int main() { 
    float** p= new float*[5]; 
    f(p); 
    h(p); 
} 

는 GCC로 컴파일 :

+1

이유를 설명하지 못합니다. –

+0

@ David : 다른 답변으로 설명합니다. 난 그냥 게으른거야 : P – Nawaz

0

http://ideone.com/RrIXl가 답을 여러분 모두 감사합니다. 이제 Faq를 읽고 컴파일러 테스트를 한 결과 어떻게 작동하는지 완전히 이해했다. 마지막으로;)

+3

StackOverflow의 형식은 일반 포럼과 다릅니다. 대화를 유지하기 위해 답을 추가해서는 안됩니다. 그 목적을 위해 주석을 사용하십시오. –

+0

@David : 죄송합니다. 시합은 이미 여기에서 답변을 파악 했으므로 실제로 계속 진행하지 않으려했습니다. – Robert

+0

문제 없음 :) 항상 대답을 수락 할 수 있으며, 이는 상당히 만족 스럽다는 것을 의미합니다. . –

1

대부분의 유효한 답변에 중요한 관찰을 추가하면 C 및 C++에서 상황이 달라집니다. 트릭이 Foo const* const*과 함께 C++에서 작동하는 반면 C에서는 작동하지 않지만, 이것을 받아들이지 않고 경고를 던질 것입니다.

Foo const* const*으로 타입 세이프 캐스트하려면 C에서 좀 더 복잡한 방법을 사용해야합니다.

+0

나는 왜 C++ (C11조차도)이 C++과는 반대로'Foo **'를'Foo const * const *'로 암묵적으로 형 변환하지 못하는 이유를 찾을 수 없었다. 그걸 알게 되니? –

+0

나는 규칙을 구현하는 것이 순진한 컴파일러 구현에 너무 복잡 할 것이라고위원회가 생각한 막연한 기억이있다. (혹시 그러한 짐승이 존재 했는가?) 어쨌든 이것은 C에서 진짜 제한이며 다차원 함수 매개 변수에 대해'const'를 거의 비실용적으로 만든다. –

+0

이것은 나를 울게하고 싶다. 진짜, 객관적인 결핍입니다. 필자는 컴파일러를 작성한 적이 없지만 길이가 <= 1 인 것과는 달리 암시 적으로 추가 된'const' 길이의 체인을 추가 할 때 너무 복잡한 것을 보지 못합니다. –

관련 문제